Skocz do zawartości

Zolw2305

Użytkownicy
  • Zawartość

    31
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Zolw2305

  • Ranga
    3/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Gdynia
  1. Nie mam zamiaru lutować akumulatorów do płytki, nigdy tak nie robię. Chodzi o to że nawet jak podłączę go za pomocą złącz to nie będę go wyjmował, a do ładowania wyprowadzę na obudowie osobne złącze, do tego dorzucę przełącznik 2 lub 3 pozycyjny, żeby przełączać obwody na zasilanie/ładowanie. Z tego co widzę musiałbym tak samo zrobić z przewodami od ballancera.
  2. Dzięki za wyjaśnienie, problem w tym że po zmontowaniu, nie będzie swobodnego dostępu do mikrokontrolera, żeby przy każdym ładowaniu odłączać te przewody od ADC. Wygląda na to że będę musiał pokombinować z przełącznikami albo przekaźnikami.
  3. Witam. Mam pakiet Li-Po złożony z 3 ogniw (11,1V) i ładowarkę, niestety bez balancera. Chciałbym w swoim projekcie, na stałe podłączyć przewody służące do podłączenia balancera, do przetwornika ADC mikrokontrolera, aby mierzył napięcie na poszczególnych ogniwach. Nie wiem tylko czy problem nie pojawi się przy ładowaniu pakietu, gdy główne przewody będą podłączone do ładowarki a przewody balancera nadal do mikrokontrolera, który co prawda będzie wyłączony, ale 2 z 3 przewodów będę musiał ,,przepuścić" przez dzielnik napięcia, żeby nie uszkodzić ADC (max 5V). Stąd pytanie, czy przez przewody balancera przy ładowaniu przepływa prąd, czy służą one jedynie do pomiaru napięcia?
  4. Witam ponownie, nie zakładam nowego tematu, bo problem nadal dotyczy ATmegi i Arduino. Wysyłam znak typu unsigned char (np. 200) z Atmegi przez TxD i odczytuję go na Arduino z RxD, za pomocą komendy Serial.read. Jednak odebrane dane otrzymuję w kodzie ASCII (zamiast 200 - mam 232). Chciałbym je otrzymywać jako unsigned char, bez żadnych konwersji. Nie wiem czy problem leży po stronie Arduino i instrukcji serial.read, czy może po stronie USART w Atmedze?
  5. Witam. Mam ze strony Atmela kod źródłowy realizujący programowy UART, napisany w asemblerze (AVR305). Chciałbym w c wywoływać funkcje, które realizowały by podprogramy putchar, getchar (nadawanie, odbiór). Wiem że muszę dodać w makefile plik.S ale nie wiem jak zrealizować wywoływanie poszczególnych funkcji. Np aby przesłać jakieś dane, chciałbym wywołać funkcję putchar(data). Lub aby dane odebrać - data = getchar(). W jaki sposób wskazać w pliku asemblera argument data, który miałby zostać użyty do wysłania? Kompilator - avr-gcc Kod źródłowy z asemblera: ;* Title : Half Duplex Interrupt Driven Software UART ;* Version : rev. 1.2 (24-04-2002), reset vector added ;* : rev. 1.1 (27.08.1997) ;* Last updated : 24-04-2002 ;* Target : AT90S1200 ;* Can be used with all AVR Device. In devices without HW ;* stack the stackpointer must be set up. ;* ;* Support email : avr@atmel.com ;* ;* Code Size : 32 Words ;* Low Register Usage : 0 ;* High Register Usage : 4 ;* Interrupt Usage : None ;* ;* DESCRIPTION ;* This Application note contains a very code efficient software UART. ;* The example program receives one character and echoes it back. ;*************************************************************************** .include "m16def.inc" ;***** Pin definitions .equ RxD =0 ;Receive pin is PD0 .equ TxD =1 ;Transmit pin is PD1 ;***** Global register variables .def bitcnt =R16 ;bit counter .def temp =R17 ;temporary storage register .def Txbyte =R18 ;Data to be transmitted .def RXbyte =R19 ;Received data .cseg .org 0 rjmp reset ;*************************************************************************** ;* ;* "putchar" ;* ;* This subroutine transmits the byte stored in the "Txbyte" register ;* The number of stop bits used is set with the sb constant ;* ;* Number of words :14 including return ;* Number of cycles :Depens on bit rate ;* Low registers used :None ;* High registers used :2 (bitcnt,Txbyte) ;* Pointers used :None ;* ;*************************************************************************** .equ sb =1 ;Number of stop bits (1, 2, ...) putchar: ldi bitcnt,9+sb ;1+8+sb (sb is # of stop bits) com Txbyte ;Inverte everything sec ;Start bit putchar0: brcc putchar1 ;If carry set cbi PORTD,TxD ; send a '0' rjmp putchar2 ;else putchar1: sbi PORTD,TxD ; send a '1' nop putchar2: rcall UART_delay ;One bit delay rcall UART_delay lsr Txbyte ;Get next bit dec bitcnt ;If not all bit sent brne putchar0 ; send next ;else ret ; return ;*************************************************************************** ;* ;* "getchar" ;* ;* This subroutine receives one byte and returns it in the "Rxbyte" register ;* ;* Number of words :14 including return ;* Number of cycles :Depens on when data arrives ;* Low registers used :None ;* High registers used :2 (bitcnt,Rxbyte) ;* Pointers used :None ;* ;*************************************************************************** getchar: ldi bitcnt,9 ;8 data bit + 1 stop bit getchar1: sbic PIND,RxD ;Wait for start bit rjmp getchar1 rcall UART_delay ;0.5 bit delay getchar2: rcall UART_delay ;1 bit delay rcall UART_delay clc ;clear carry sbic PIND,RxD ;if RX pin high sec ; dec bitcnt ;If bit is stop bit breq getchar3 ; return ;else ror Rxbyte ; shift bit into Rxbyte rjmp getchar2 ; go get next getchar3: ret ;*************************************************************************** ;* ;* "UART_delay" ;* ;* This delay subroutine generates the required delay between the bits when ;* transmitting and receiving bytes. The total execution time is set by the ;* constant "b": ;* ;* 3ˇb + 7 cycles (including rcall and ret) ;* ;* Number of words :4 including return ;* Low registers used :None ;* High registers used :1 (temp) ;* Pointers used :None ;* ;*************************************************************************** ; Some b values: (See also table in Appnote documentation) ; ; 1 MHz crystal: ; 9600 bps - b=14 ; 19200 bps - b=5 ; 28800 bps - b=2 ; ; 2 MHz crystal: ; 19200 bps - b=14 ; 28800 bps - b=8 ; 57600 bps - b=2 ; 4 MHz crystal: ; 19200 bps - b=31 ; 28800 bps - b=19 ; 57600 bps - b=8 ; 115200 bps - b=2 .equ b =31 ;4800 bps @ 1 MHz crystal UART_delay: ldi temp,b UART_delay1: dec temp brne UART_delay1 ret ;***** Program Execution Starts Here
  6. Więc tak, problem na pewno leży po stronie Arduino (model Arduino UNO z ATmega328), bo sprawdzając komunikację na samej ATmega16 przez zwarcie TxD i RxD cała komunikacja przebiega prawidłowo. Na Arduino odbieram dane przez pin RxD (wyprowadzenie oznaczone jako 0), a sprawdzając otrzymane dane, wysyłam to co otrzymałem na Serial Monitor przez USB. Prędkość na Serial Monitorze się zgadza. Przy moim 2 wariancie widać że Arduino odpowiada, bo ekran Serial Monitora się przewija, ale nic na nim nie jest wyświetlane. Właśnie sprawdziłem Twój program mactro. Problem leży gdzieś po stronie Serial Monitora, bo przesłałem dane z TxD ATmegi do RxD Arduino (z Twoim softwarem) a z TxD Arduino do RxD ATmegi i cała komunikacja śmiga jak ta lala, więc coś jest z tym Serial Monitorem nie tak. W każdym bądź razie to co miało działać działa, więc problem rozwiązany. Wielkie dzięki za pomoc.
  7. Witam, buduję robota opartego o system Arduino. Mam problem z komunikacją po RS. Docelowo dane do robota mają być wysyłane z LabView, ale w celach testowych postanowiłem wykorzystać do tego uC ATmega16. Pin TxD Atmegi jest zwarty z pinem RxD Arduino. Program wysyłający dane z ATmegi (ma wysłać wartość 0x80): /*Ustalenie prędkości transmisji*/ #define F_CPU 1000000L #define BAUD 4800 #define MYUBRR F_CPU/16/BAUD-1 #include <stdio.h> #include <avr/io.h> #include <util/delay.h> /* Inicjalizacja USART */ void USART_init(unsigned int ubrr) { /* Ustala prędkość transmisji */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Włącza nadawanie */ UCSRB = (1<<TXEN); /* Format ramki: 8 bitów danych, 1 bit stopu */ UCSRC = (1<<URSEL)|(3<<UCSZ0); } /* Wysyłanie znaku */ void USART_Transmit(unsigned char data) { while(!(UCSRA & (1<<UDRE))) ; UDR = data; } /* GŁÓWNA FUNKCJA */ int main(void) { /* Inicjalizuje port szeregowy AVRa */ USART_init(MYUBRR); /* Główna pętla */ while(1) { char temp = 0x80; /* Wysyła dane do portu szeregowego */ USART_Transmit(temp); } } Program Arduino, odczytujący dane (2 warianty: 1 - po odczytaniu 0x80 ma się na chwilę zapalić dioda testowa podpięta pod pin13; 2 - odczytana wartość z RxD ma zostać wyświetlona na Serial Monitor - konsoli Arduino) 1: void setup() { // inicjalizacja portu szeregowego: Serial.begin(4800); pinMode(13,OUTPUT); } void loop() { if (Serial.available() > 0) { char inByte = Serial.read(); if(inByte == 0x80) { digitalWrite(13,HIGH); delay(1000); digitalWrite(13,LOW); delay(1000); } } } W 2 wariancie instrukcje if(inByte == 0x80) {....} zastąpiono: Serial.println(inByte, BYTE); delay(2000); W pierwszym wariancie dioda nie zapala się w ogóle, natomiast w 2, na Serial Monitorze nie wyświetla się żadna wartość. Czy może to być przyczyna taktowania ATmegi przez wewnętrzny oscylator 1MHz, czy wina stoi po stronie programu?
  8. Witam, odkopię trochę temat, ponieważ nie mogę sobie poradzić z pewnym problemem. Zakupiłem ostatnio HM-T868S i HM-R868S, ze względu na to że na wyjściu odbiornika pojawia się to samo co na wejściu nadajnika idealnie nadają się do mojego niby banalnego projektu. Sprawa jest prosta, nie chcę tu używać żadnego uC, ponieważ były by to zbędne koszty. Wejście nadajnika podciągam przez rezystor do 0V lub 3V. Wyjście odbiornika podpięte jest do bazy tranzystora pnp, który ma załączać buzzer. Problem polega na tym że na wyjściu odbiornika cały czas mam 1,6 - 1,8V względem masy, bez względu na to czy wejście odbiornika jest podpięte do 0 czy 3V, a nawet jak nadajnik jest całkiem odłączony to i tak na odbiorniku ciągle jest ok 1,7V. Wejście enable zgodnie z dokumentacją, podczas załączenia zasilania stan niski, po załączeniu stan wysoki. Czy te moduły rzeczywiście działają w ten sposób - wejście nadajnika = wyjscie odbiornika? Czy może potrzebują jednak uC, który będzie wysyłał dane z określoną prędkością przez UART?
  9. Akumulator ku mojemu zdziwieniu, normalnie się ładuje, na początku podładowałem go prądem 0,1 C (czyli w moim przypadku 0,1 * 5 = 0,5 A) do 3,3V na celle, a dalej już normalnie 1 C (5 A). Wszystko ładowarką do li-poly. Ciekawe tylko jak będzie z pojemnością, podejrzewam że początkowego 5Ah już nie osiągnę.
  10. No niby nie trzeba, ale nawet sprzedawca na stronie internetowej zaleca 1-2 krotne rozładowanie i naładowanie, więc pomyślałem że nie zaszkodzi - zaszkodziło. Z własnej głupoty, ale człowiek uczy się na błędach, drugi raz już li-pola nie będę próbował formatować.
  11. Przeładowanie przeładowaniem, ja dzisiaj za to narobiłem bigosu w drugą stronę. Chciałem sformatować nowego Li-Pola, więc podłączyłem sobie żarówkę i poszedłem oglądać tv. Jak sobie przypomniałem o baterii to było już poniżej 2V na celle i trochę spuchła (nie wiele ale jednak) :/ Teraz po ostygnięciu zmierzyłem i było 2,45 V na celle. Wyczytałem że ludzie ,,odratowują" li-pole ładując je ładowarkami do NiMh małym prądem do osiągnięcia >3V na celle i działa dalej. Jutro mam zamiar też spróbować tylko nie wiem czy takie ładowanie ładowarką do NiMh nie spowoduje pożarów tudzież innych niepożądanych skutków?
  12. Dobrze prawicie z tą zewnętrzną aplikacją, oczywiście takowa będzie. Postaram się pokrótce opisać co i jak. Arduino będzie sterowało trzema regulatorami silników bezszczotkowych, za pomocą PWM (tak jak sterowanie serwami). Wartość wypełnienia będzie wysyłana z aplikacji LabView przez RS232. Wysyłane będą wartości od 0 do 200 (tak aby mieściły się w 1 bajcie) i konwertowane na odpowiednie wartości wypełnienia PWM (920....2120 us). 3 silniki = 3 bajty wysłanych danych. Serial monitor ma mi posłużyć do sprawdzenia czy komunikacja i konwersja przebiega prawidłowo (zanim ukończymy aplikację LV), dlatego właśnie zależy mi na tym aby wartość 0...200 była wysłana w 1 bajcie. Ale widzę że to chyba nie wykonalne za pomocą serial monitora. Nie wiem tylko gdzie leży problem, czy to wartości w serial monitor są konwertowane na pojedyncze znaki ascii, czy to instrukcja serial.read() odczytuje tylko po jednym znaku i konwertuje go na ascii?
  13. Tak, ale Serial.println wysyła z Arduino do Serial Monitor, a mi chodzi o transmisję w drugą stronę, czyli z Serial monitor do Arduino. Przykład który podał tomly działa, tylko nie wiem czy wysyłając za pomocą string wartości dajmy na to 179, wysyłam to w formie 1 czy więcej bajtów?
  14. Dzięki, trochę to rozjaśniliście. Synchronizację myślałem żeby i tak zrobić, co by uniknąć jakiś pomyłek w transmisji. Jutro będę próbował. Jeszcze raz dzięki. Aktualizacja: Pojawił się natomiast inny problem. Nie mogę wysłać dowolnego bajtu danych przez Serial Monitor. Mając np taki program: void setup() Serial.begin(9600); void loop() { if(Serial.available()) int x = Serial.read(); Serial.println(x); } Wpisując w serial monitor wartość np. 251, wyświetla się najpierw 2 potem 5 a na końcu 1 (a właściwie ich odpowiedniki w ascii). Problem w tym że nie mogę wysłać całego bajtu x = 0....255, tylko każdy znak wysyła się oddzielnie, czyli w przypadku 255 zamiast 1 bajtu, arduino odbiera 3. Da się coś z tym zrobić?
  15. Witam, mam pewien mały problem. Mam zamiar za pomocą systemu Arduino sterować trzema regulatorami silników bezszczotkowych (ESC). Sterowanie to przebiega tak samo jak w przypadku serwomechanizmów (PWM). Wartość wypełnienia w us jest przesyłana do Arduino przez port szeregowy. Problem polega na tym że docelowo wartości te mają być generowane przez odpowiednie wychylenia potencjometrów z konsoli sterującej (x i y). Chciałbym przesłać równocześnie obie te wartości (x,y) serialem, a następnie rozdzielić je na zmienną x i zmienną y. Nie proszę oczywiście o gotowy kod źródłowy ale byłbym wdzięczny za podsunięcie jakiś pomysłów jak to zrobić? Poniżej fragment kodu, który działa dla przesyłania 1 wartości: void set_speeds(int servo, int usvalue) { escservos[servo].writeMicroseconds(usvalue); } void setup() { Serial.begin(9600); // Attaches the ESC's on pins 2, 3, 4 to the servo object. for(int s=0; s<3; s++) escservos[s].attach(s+2, FULLREWARD, FULLTHROTTLE); } void loop() { if(Serial.available()) { usvalue = Serial.read(); } for(int s=0; s<3; s++) set_speeds(s, usvalue); }
×
×
  • Utwórz nowe...