Sari la conținut
ELFORUM - Forumul electronistilor

intrebari punctuale.


lutza2

Postări Recomandate

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

@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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări