Страницы

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

вторник, 25 февраля 2020 г.

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

#c #микроконтроллеры #avr


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


Ответы

Ответ 1



Для определния значения напряжения у МК должен быть встроенный АЦП, но по моему в прошлом вопросе Вы говорили что используете 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\n\r ADC= ", adc); //Устанавливаем задержку после каждой отправки delay_ms(1000); } } Как принимать и отправлять я отвечал Вам в предыдущем вопросе: Как на Си передать информацию от микроконтроллера на COM- порт?

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

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