Форум РадиоКот https://radiokot.ru/forum/ |
|
Ацп atmega8 https://radiokot.ru/forum/viewtopic.php?f=22&t=144916 |
Страница 1 из 1 |
Автор: | anslepnev [ Сб май 06, 2017 06:37:02 ] |
Заголовок сообщения: | Ацп atmega8 |
Здравствуйте, подскажите, пожалуйста, как выводить данные из ADCH на wh0802? И нужно ли использовать таймер при работе ацп? Или можно задать непрерывное преобразование, и если непрерывное, то как считывать данные? Прошу строго не судить, только начал осваивать... |
Автор: | pyzhman [ Сб май 06, 2017 07:25:50 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
Считать регистр ADCH и согласно протоколу общения с ЖКИ вывести оные. Таймер не обязательно. Можно. Там взводится флаг об окончании очередного преобразования. |
Автор: | mickbell [ Сб май 06, 2017 11:29:47 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
Таки желательно таймер использовать, и по нему забирать данные из АЦП, причём довольно редко (или редко отправлять их в индикатор), иначе цифры мельтешить будут, слишком часто меняясь. Но это уже вопрос эргономики, а не устройства софта. |
Автор: | roman.com [ Сб май 06, 2017 13:26:31 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
anslepnev писал(а): нужно ли использовать таймер при работе ацп? Нет. Все используют флаг окончания преобразования АЦП: while ((ADCSRA & 0x10)==0); //...1 .... ADIF - 1- флаг завершения преобразования (1-сброс при каждом Старте. 2-для прерывания очищается аппаратно) anslepnev писал(а): Или можно задать непрерывное преобразование можно... регистр ADCSRA , где: //1... .... ADEN - 1- вкл ADC. //.1.. .... ADSC - 1- Старт ADC. При завершении преобразования сбрасывается аппаратно. //..1. .... ADFR - 1- режим Непрерывного Преобразования. //...1 .... ADIF - 1- флаг завершения преобразования -сброс при каждом Старте. -для прерывания очищается аппаратно //.... 1... ADIE - 1- Разрешение прерывания //.... .1.. ADPS2 - предделетель 0 - //.... ..1. ADPS1 - предделетель 0 - =1/2 тактовой частоты. //.... ...1 ADPS0 - предделетель 0 - но зачем непрерывное преобразование? anslepnev писал(а): как считывать данные? читаем ADCH после окончания преобразования (когда установится флаг окончания преобразования). //...1 .... ADIF - 1- флаг завершения преобразования |
Автор: | anslepnev [ Сб май 06, 2017 15:19:44 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
спасибо за ответы. Насколько я понял из даташита, преобразованное значение хранится в ADCH:ADCL и битом ADLAR выставляем выравнивание, если мы берем, например, переменную v (напряжение) и записываем, что v=ADCH, предварительно выставив бит ADLAR, то ничего не работает...подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение? |
Автор: | roman.com [ Сб май 06, 2017 17:26:23 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
anslepnev писал(а): подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение? В АЦП mega8 два регистра настройки: ADMUX и ADCSRA. Значение АЦП хранится в ADCH (00000011):ADCL(11111111) или ADCW(00000011 11111111). Подробней: ---------- Регистр ADMUX (00000000), где: //1... .... REFS1 - опорное напряжение //.1.. .... REFS0 - опорное напряжение //..1. .... ADLAR - Выравнивание результата //...1 .... - //.... 1... MUX3 - номер канала //.... .1.. MUX2 - номер канала //.... ..1. MUX1 - номер канала //.... ...1 MUX0 - номер канала ---------- подробней: //REFS1=0 REFS0=0 - ИОН=AREF //REFS1=0 REFS0=1 - ИОН=AVCC //REFS1=1 REFS0=0 - не используется (зарезервировано) //REFS1=1 REFS0=1 - ИОН=2.56V (встроенный ИОН 2.56V) //ADLAR=1 // Выравнивание результата в левую сторону < (8-бит): // ADCH // 1111 1111 - читать первым ???????????????????????????????????????? // ADCL // 0000 0000 - читать первым ????????????????????????????????????? ... Надо уточнить по даташиту... не помню)) //ADLAR=0 // Выравнивание результата в правую сторону > (10-бит): // ADCH // 0000 0011 - читать вторым // ADCL // 1111 1111 - читать первым !!! ---------- // MUX3...MUX0 - номер канала: // 0000 - ADC0 // 0001 - ADC1 // ................. // 0111 - ADC7 ---------- Регистр ADCSRA (00000000), где: //1... .... ADEN - 1- вкл ADC. //.1.. .... ADSC - 1- Старт. При завершении преобразования сбрасывается аппаратно. //..1. .... ADFR - 1- режим Непрерывного Преобразования. //...1 .... ADIF - 1- флаг завершения преобразования -сброс программно. -для прерывания очищается аппаратно //.... 1... ADIE - 1- Разрешение прерывания //.... .1.. ADPS2 - предделетель 0 - //.... ..1. ADPS1 - предделетель 0 - =1/2 тактовой частоты. //.... ...1 ADPS0 - предделетель 0 - ---------- подробней: предделитель ADC: ADPS2 -ADPS1 -ADPS0 // 000: 1 МГц/2=500.000 Hz // 001: 1 МГц/2=500.000 Hz // 010: 1 МГц/4=200.000 Hz // 011: 1 МГц/8=125.000 Hz // 100: 1 МГц/16=62.500 Hz // 101: 1 МГц/32=31.250 Hz // 110: 1 МГц/64=15.625 Hz // 111: 1 МГц/128=7.812,5 Hz ---------- Чтобы не забивать себе мозги с ADCH:ADCL, делаем по другому: Берем, например, переменную v (Int (00000000 00000000)) (напряжение) и записываем v=ADCW; (00000011 11111111). ---------- Рабочий пример (вариант 1): int v; ADMUX=0b01000101; // канал 5 delay_us(10); // стабилизация входа... ADCSRA|=0b01000000; // Старт преобразования. while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования v=ADCW; // (напряжение) (00000011 11111111). ---------- Рабочий пример (вариант 2): int v; ADMUX=0b01000101; // канал 5 delay_us(10); // стабилизация входа... ADCSRA|=0b01000000; // Старт преобразования. while (ADCSRA & 0b01000000); // ADSC - При завершении преобразования этот бит сбрасывается аппаратно. v=ADCW; // (напряжение) (00000011 11111111). ---------- P.S. Даже если мне достаточно точности измерения АЦП 8-бит, я настраиваю АЦП в режим 10-бит (ADLAR=0, Выравнивание результата в правую сторону). Зачем? Чтобы убрать шум на входе АЦП и шум самого АЦП. |
Автор: | anslepnev [ Вс май 07, 2017 08:27:57 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
float v; InitLcd(); ADMUX=0b01000101; // канал 5 _delay_us(10); // стабилизация входа... ADCSRA|=0b01000000; // Старт преобразования. while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования v=ADCW*0.00489; // (напряжение) (00000011 11111111). char buffer [10]; //InitADC(); sprintf(buffer, "U=%.1f", v); LcdWriteCom(0b00000001); _delay_ms(10); Send_Str(buffer,10); // Отправляем строку _delay_ms(100); //Пауза ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование while(1); { } Подскажите, пожалуйста, где ошибка в программе, просто текст у меня выводится на wh0802, а вот с выводомданных из ацп проблемы..вместо данных мигающий курсор... |
Автор: | roman.com [ Вс май 07, 2017 22:19:52 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? )) |
Автор: | anslepnev [ Пн май 08, 2017 06:21:59 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
roman.com писал(а): А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? )) у меня на макетке собрано, на дисплее просто мигающий курсор, а не значения АЦП... |
Автор: | mickbell [ Пн май 08, 2017 12:44:41 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
Выведите туда для начала любое число вместо отсчёта АЦП, хотя бы 123, и посмотрите, вывелось ли оно. Очень вероятно, что не работает вывод в 44780 и АЦП тут вовсе не при делах. |
Автор: | anslepnev [ Вт май 09, 2017 06:09:36 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
Число выводится на дисплей, текст выводится, в общем статическая индикация работает, где то ошибка в программе, а вот где- никак не пойму |
Автор: | mickbell [ Вт май 09, 2017 16:16:05 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
Наблюдаю взаимоисключающие параграфы. С одной стороны: на дисплее просто мигающий курсор, а не значения АЦП... С другой стороны:Число выводится на дисплей, текст выводится, в общем статическая индикация работает Так есть индикация или нет её?
|
Автор: | Ivanoff-iv [ Ср май 17, 2017 19:17:52 ] |
Заголовок сообщения: | Re: Ацп atmega8 |
а почему преобразование написано до цикла, а не внутри? так оно всего 1 раз выполнится. для поиска неисправности постепенно продвигайся от экрана к ацп (сначала в v какое нибудь число впиши, потом int переменную вместо ADCW подставь...) Добавлено after 12 minutes 9 seconds: я полагаю, это ардуино, а в ней функция sprintf не поддерживает формат чисел с плавающей запятой. Добавлено after 6 minutes: Самый простой способ преобразования float в текстовую строку – использование функции dtostrf.
char* dtostrf(double data, signed char width, unsigned char prec, char *string) data – это конвертируемая переменная; width – число значащих разрядов; prec – число разрядов после запятой; char* string – указатель на строку (имя массива). |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |