В процессе программирования микроконтроллеров AVR появилась необходимость измерения напряжения и передачи его на ПК. Передачу на ком порт я освоил по ранее заданному вопросу, сейчас хотелось бы узнать как измерить напряжение?
Ответ
Для определния значения напряжения у МК должен быть встроенный АЦП, но по моему в прошлом вопросе Вы говорили что используете AtMega32, так вот у него аж 8 каналов. Ниже приведу программу для определения значения напряжения, но прежде попытаюсь разъеснить что к чему на Вашем конкретном МК. Каналов, как я сказал, восемь. АЦП 10 разрядный, но можно в настройках установить 8 разрядов. Точность измерения АЦП вплоть до младшего значения, то есть если мы берем 10 разрядный АЦП, то у него 1023 младшие единицы, а значит при опорном напряжении 5В точность будет 5000 мВ/1023 т.е. приблизительно 4мВ. В настройках необходимо будет указать частоту дискретизации.
Так значит перейдем к ПО. Описывать особо не буду, всю информацию сможете подчеркнуть в комментариях.
#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- порт?
Комментариев нет:
Отправить комментарий