lutza2 Postat Decembrie 1, 2015 Autor Partajează Postat Decembrie 1, 2015 Merci, o sa incerc. Ca sa-i raspund lui thunder, metoda pe care am testat-o merge la 1Hz, dar la 2,4 Hz deja nu mai merge pentru ca semnalul nu mai e periodic, serialprint transmitand numerele in timpi diferiti in functie de marimea lor. Intradevar e foarte lent, trebuie alta abordare. Link spre comentariu
Mircea Postat Decembrie 1, 2015 Partajează Postat Decembrie 1, 2015 Era doar o idee. In plus, nu ma gandeam la o citire, o afisare. Mai curand un sir de citiri si apoi afisarea lor.Marius ti-a dat o solutie functionala. Link spre comentariu
lutza2 Postat Decembrie 7, 2015 Autor Partajează Postat Decembrie 7, 2015 Da, dar pierd acel aproape real-time, care mi-ar trebui in faza finala cand renunt la sinus si masor cu pad-uri. Poate ar trebui sa transmit mai rar si alt soft sa refaca semnalul ? Link spre comentariu
nico_2010 Postat Decembrie 10, 2015 Partajează Postat Decembrie 10, 2015 @lutza2: Incearca pe Arduino codul de mai jos. Nu este perfect dar functioneaza rezonabil. Colecteaza 128 de valori si le listeaza pe USART, asa ca ulterior le poti prelucra cum vrei. #include <avr/io.h>#include <stdlib.h>#define F_CPU 16000000UL#include <util/delay.h>#include <avr/interrupt.h>#define BAUDRATE 9600#define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1) #define RESET &=~#define SET |=#define TOGGLE ^=volatile uint8_t LED_mask = 0x04; // volatile uint8_t LED_mask2 = 0x08; // volatile uint8_t compare_value = 0x07; // frecventa de esantionare 250kHzvolatile uint16_t ADCresult = 0;char buffer[16];uint8_t i , j;uint16_t collection[256]; // aici se colecteaza datele citite de la adc volatile uint8_t samples=0;uint8_t temp=0;volatile uint32_t filtsum;volatile uint8_t shift = 2;void USART_init(void); //Initializare USART/serialvoid USART_send(unsigned char data); //Functie de transmitere pe serial a datelorvoid USART_putstring(char* StringPtr); //Functie de transmitere a sirurilor de caractere pe serialISR (TIMER0_COMPA_vect){ ADCSRA |=(1 << ADIF); // Flag de intreupere activat PORTD TOGGLE LED_mask2; // LED aprins/stins}ISR (ADC_vect){ filtsum += (ADC - (filtsum >> shift)); ++samples; TIFR0 = TIFR0; PORTD TOGGLE LED_mask; // LED aprins/stins}void timer0_init(void){// NOTA: Valorile corespund frecventei de esantionare de 250kHz// OCR0A = compare_value; // 0x07 TCCR0A = 0x02; // CTC Mode -> Timer/Counter1 Compare Match A every 4us -> 250KHz TCCR0B = 0x02; // prescaler =8 TIMSK0 |= (1<<OCIE0A); // Compare A Interrupt activat TCNT0 = 0x00;}void LED_init(void){ PORTD = 0xFF; // PORTD set (LED oprit) DDRD = 0xFF; // PORTD iesire}void ADC_init(void){ADCSRA = 0x00; //disable adcADMUX = 0x40; //select adc input 0ADCSRA = 0xAF; // ADEN = 1 - ADC Enable // ADSC = 0 - ADC Start Conversion // ADATE = 1 - ADC Auto Trigger Enable // ADIF = 0 - ADC Interrupt Flag // ADIE = 1 - ADC Conversion Complete Interrupt activata // ADPS2:0 = 111 Division factor = 4 => 250KHzADCSRB = 0x03; // ADTS2:0 = 011 - Timer/Counter0 Compare Match A }void USART_init(void){ UBRR0H = (uint8_t)(BAUD_PRESCALLER>>8); UBRR0L = (uint8_t)(BAUD_PRESCALLER); UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0C = (3<<UCSZ00);} void USART_send( unsigned char data){ while(!(UCSR0A & (1<<UDRE0))); UDR0 = data; } void USART_putstring(char* StringPtr){ while(*StringPtr != 0x00){ USART_send(*StringPtr); StringPtr++;} }int main(void){ timer0_init(); ADC_init(); LED_init(); USART_init(); //Setup the USART sei(); i=0; while(1) { for (i=0; i<128; i++){ if (samples>16){ ADCresult=(filtsum >> shift); collection[i]=ADCresult; } USART_send('r'); USART_send('n'); itoa(collection[i], buffer, 10); USART_putstring(buffer); } ADCresult=0; samples= 0; } return 0;} Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum