Страницы

Поиск по вопросам

вторник, 14 мая 2019 г.

Как определить значение АЦП на языке C?

В процессе программирования микроконтроллеров AVR появилась необходимость измерения напряжения и передачи его на ПК. Передачу на ком порт я освоил по ранее заданному вопросу, сейчас хотелось бы узнать как измерить напряжение?


Ответ

Для определния значения напряжения у МК должен быть встроенный АЦП, но по моему в прошлом вопросе Вы говорили что используете AtMega32, так вот у него аж 8 каналов. Ниже приведу программу для определения значения напряжения, но прежде попытаюсь разъеснить что к чему на Вашем конкретном МК. Каналов, как я сказал, восемь. АЦП 10 разрядный, но можно в настройках установить 8 разрядов. Точность измерения АЦП вплоть до младшего значения, то есть если мы берем 10 разрядный АЦП, то у него 1023 младшие единицы, а значит при опорном напряжении 5В точность будет 5000 мВ/1023 т.е. приблизительно 4мВ. В настройках необходимо будет указать частоту дискретизации. Так значит перейдем к ПО. Описывать особо не буду, всю информацию сможете подчеркнуть в комментариях.
#include #include #include
//Определим название канала с которого мы и будем считывать значение АЦП #define ADC_0 0
// функция read_adc() и будет нам возвращать значение АЦП unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); //Задержка необходимая для стабилизации значения АЦП delay_us(10); // Преобразование значения ADCSRA|=0x40; // Ожидаем окончания обработки while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; //Возвращаем значение АЦП return ADCH; }
int adc; //Переменная которая будет хранить в себе текущее значение АЦП
void main(void) { //Настраиваем МК PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x0C; PORTC=0x00; DDRC=0xC3; PORTD=0x00; DDRD=0x88; TCCR0=0x6B; TCNT0=0x00; OCR0=0x5F; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x5F; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; ACSR=0x80; SFIOR=0x00;
// Инициализация АЦП // Частота преобразования: 125,000 kHz // Ножка на которую будет подаваться опорное напряжение: AVCC pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0xA7; SFIOR&=0x1F;
while (1) { //Присваиваем текущее значение АЦП переменной adc adc = read_adc(ADC_0); //Отправляем на ПК полученное значение, которое на нем вы сможете преобразовать в напряжение по формуле (adc/1023)*Vref, где Vref - опорное напряжение МК printf("%d

ADC= ", adc); //Устанавливаем задержку после каждой отправки delay_ms(1000); } }
Как принимать и отправлять я отвечал Вам в предыдущем вопросе: Как на Си передать информацию от микроконтроллера на COM- порт?

Комментариев нет:

Отправить комментарий