Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Для перевода 10 разрядных данных АЦП в 8 разрядные используется функция
map(val, 0, 1023, 0, 255);
где val – int переменная c 10 значимыми разрядами.
void autoadcsetup(){
//set up TIMER0 to 62.5kHz
//TIMER0_OVF will be the trigger for ADC
/*normal mode, no prescaler
16MHz / 256 = 62.5 kHz*/
TCCR0B = (1 << CS00);//timer frequency = clk/1
//set ADC.
ADMUX = (1 << ADLAR) | (1 << REFS0) | (1 << MUX0);//8-bit mode, ADC0 channel, AVVCC as ref
ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2);//TUrn ADC On, trigger enable, Interrupt enable, sysclk/16=1MHz_ADC_clk=76kHz conv freq(13ticks per conversion)
ADCSRB = (1<< ADTS2) ;//Auto trigger source
//set UART to 8-n-1 1Mbod:
UBRR0H = 0;//1Mbod (use Examples of Baud Rate Setting table from datasheet)
UBRR0L = 0;//1Mbod
UCSR0B = (1<<TXEN0);//enable Transmitter
UCSR0C = (3<<UCSZ00);//8-bit mode
}
ISR(ADC_vect){
if( ( UCSR0A & (1<<UDRE0)) ){
UDR0 = ADCH;//copy result.
}
}
Вывод: максимальная частота преобразования АЦП Arduino UNO c процессором ATmega328 не превышает 10 кГц.
На результат не влияют: установка частоты преобразования 76 КГц и выше битами ADPS0… ADPS2
void setup() {
Serial.begin (57600); // 9600, 19200, 38400, 57600 and 115200 bit/s
ADCSRA = (1 << ADEN) // Включаем АЦП
|(1 << ADPS2); // устанавливаем предделитель преобразователя на 8
ADMUX = (1<< ADLAR) | (1 << REFS0) //выставляем опорное напряжение, как внешний ИОН
|(0 << MUX0); // снимать сигнал будем с входа PC0
}
int u=0;
void loop(){
unsigned long time_start = millis();
for (int i = 0; i < 1024; i++) {
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA & (1 << ADIF)) == 0);// пока не будет выставлено флага об окончании преобразования
u = ADCH; // Считываем полученное значение
// adc_bytes[i] = ADCL; // Считываем полученное значение
}
unsigned long time_end = millis();
unsigned int dt = time_end - time_start;
unsigned int f = 1000000000/1024/dt;
Serial.print (f);
Serial.println("Hz");
}
void setup()
{
autoadcsetup();
}
void loop()
{
}
int i = 255;
void autoadcsetup(){
//set up TIMER0 to 62.5kHz
//TIMER0_OVF will be the trigger for ADC
/*normal mode, no prescaler
16MHz / 256 = 62.5 kHz*/
TCCR0B = (1 << CS00);//timer frequency = clk/1
//set ADC.
ADMUX = (1 << ADLAR) | (1 << MUX0) | (1 << REFS0);//8-bit mode, ADC0 channel, AVVCC as ref
ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2);//TUrn ADC On, trigger enable, Interrupt enable, sysclk/16=1MHz_ADC_clk=76kHz conv freq(13ticks per conversion)
ADCSRB = (1<< ADTS2) ;//Auto trigger source
//set UART to 8-n-1 1Mbod:
UBRR0H = 0;//1Mbod (use Examples of Baud Rate Setting table from datasheet)
UBRR0L = 1;//1Mbod
UCSR0B = (1<<TXEN0);//enable Transmitter
UCSR0C = (3<<UCSZ00);//8-bit mode
}
ISR(ADC_vect){
if( ( UCSR0A & (1<<UDRE0)) ){
UDR0 = ADCH;//copy result.
}
}
Такое построение не требует компиляции Simulink модели с библиотекой реального времени (rtwin.tlc), что позволяет использовать в модели практически любые блоки библиотеки Simulink.
Обработка и oтображение сигналов на частоте преобразования АЦП