Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
15.06.2011, 23:54
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Изменить исходный код программы для ATMEGA8
Программа для измерения напряжения и тока написана на СИ
для ATMEGA8. При подаче на входы АЦП напряжения 5В, на индикаторах
высвечиваются коды 25,5 и 2,55 соответственно для напряжения и тока.
Мне необходимо, чтобы высвечивалось 50 и 5.
Пробовал менять коэффициенты преобразования АЦП
Код:
|
unsigned char i_read(void)
{
tmp=read_adc(ADCMUX_I);
tmp *=255;
tmp /=ADC_I_DIV;
return (unsigned char) tmp;
} |
255 на 511, на 2.5В показывает полную шкалу, потом начинает сначала.
Удваивал результат вывода на индикаторы
Код:
|
void uindf(unsigned char ul)
{
unsigned int ut = ul;
ut ‹‹= 1;
d[0]= ut/100;
ut %=100;
d[1]= ut/10;
ut %=10;
d[2]= ut ;
} |
в младшем разряде отображаются только четные цифры.
Сам я в программировании "ноль", доходил до изменений чисто интуитивно.
Подскажите, что где нужно изменить, что бы получить требуемый результат?
Схем измерителей в интернет полно, но эта измеряет значение тока при установке тока защиты.
Вложенный файл с исходным кодом для CodeVisionAVR и на всякий случай схемой устройства.
Вложения:
|
01.zip (192.6 Кб, 189 просмотров) |
|
|
|
|
16.06.2011, 00:33
|
|
Временная регистрация
Регистрация: 17.09.2009
Сообщений: 68
Сказал спасибо: 13
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
смущает то, что у тебя получается сейчас измерение, почти в половину меньше, чем действительно. За исключением 25.5 * 2 = 51, а не 50.
Это похоже на шумы. Дело в том, что ADCW - 16ти-битный, а сам АСП дает 10 бит. я не вижу у тебя подавление лишних разрядов.
PS: сам, правда, с АЦП еще не ковырялся. Знаю только по даташитам и статьям, но может и прав.
__________________
|
|
|
|
16.06.2011, 11:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Цитата:
|
Удваивал результат вывода на индикаторы
в младшем разряде отображаются только четные цифры.
|
Все правильно, у четных чисел самый младший разряд = 0, Отобразить нечетные не позволяет разрядность АЦП или нужно использовать 10-битовый режим.
ИМХО проще на входе АЦП поставить делитель, и добиться чтобы при 5В входного АЦП показывал 250, а уже после этого удваивать. Если особая точность не важна, то можно оставить и так. получаем порядка 2% ошибки
__________________
misterdi<@>i.ua
|
|
|
|
16.06.2011, 14:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от MisterDi
|
поставить делитель, и добиться чтобы при 5В входного АЦП показывал 250, а уже после этого удваивать
|
Ещё можно делить и умножать на кооефициент что б не морочится с делителями. В СИ это проще чем в асме. Только не забывать, что функция деления займёт програмную память.
Либо строить делитель либо отдать кусок памяти.
КОЭФ для напряжения = 255/50 = 5,1
напряжение = АЦП/5,1
КОЭФ для тока = 255/5 = 51
ток = АЦП/51
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
16.06.2011, 15:14
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Сделайте всё по-честному,
без наворотов.
1. Измеренное напряжение Vin=ADCW*Vref/1024, в вольтах или Vin=ADCW*5000/1024 для вашего случая в милливольтах. В u_read ставите tmp=tmp*5000 и tmp=tmp/ADC_U_DIV, где ADC_U_DIV=1024.
2. Измеренное напряжение на датчике тока Iin = (Uдат/0.05) в амперах. Здесь Uдат - напряжение на сопротивлении датчика тока, Rдат=0.05 Ом. Или Iin = (ADCW*5000/1024)/(0.05*Kпреобр) = ADCW*1961/1024 для вашего случая в миллиамперах. Kпреобр=51 - коэффициент преобразования ОУ напряжение-ток (уточните). В i_read ставите tmp=tmp*1961 и tmp=tmp/ADC_I_DIV, где ADC_I_DIV=1024.
3. Напряжение, которое измеряет МК равно сумме напряжений на нагрузке ПЛЮС напряжение на Rдат, зависящее от тока. Его надо вычислить и вычесть, чтобы получить истинное напряжение на нагрузке. У вас оно вычисляется неправильно. Надо так ur=iind*0.05=iind*5/100 в милливольтах, если iind в мА. Тогда uind=uind-ur.
4. Для вывода на индикатор uind=uind/10 и iind=iind/10, поскольку на индикаторе всего три цифры. Если надо удвоить uind=uind/5 и iind=iind/5. Как-то так.
Последний раз редактировалось =GM=; 16.06.2011 в 18:22.
|
|
|
|
16.06.2011, 18:16
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от picavr
|
Ещё можно делить и умножать на кооефициент что б не морочится с делителями
|
Тогда теряются значения после запятой, показывает только целые числа.
Сообщение от =GM=
|
В u_read ставите tmp=tmp*5000 и tmp=tmp/ADC_U_DIV, где ADC_U_DIV=1024.
|
Измерение идет в обратном порядке, где-то от 24.2 до 13.1.
Сообщение от =GM=
|
Для вывода на индикатор uind=uind/10 и iind=iind/10
|
Показания сдвигаются вправо и на индикаторе где-то от 2.4 до 1.4
Сообщение от =GM=
|
Если надо удвоить uind=uind/5 и iind=iind/5
|
Показания удваиваются, но все равно при увеличении напряжения показания уменьшаются от 4.8 до 2.8.
Я так думаю, что это как-то связано с записью информации с АЦП в регистры. Читал я и описание на ATMEGA, и другую инфу с интернет, но так и не понял, как это применить к этой программе. Или что-то с прерыванием таймера.
В общем, что делать-не понятно!
Последний раз редактировалось Dimitrij; 16.06.2011 в 18:39.
|
|
|
|
16.06.2011, 19:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Dimitrij
|
Тогда теряются значения после запятой, показывает только целые числа.
|
Если делать С ГОЛОВОЙ, то не теряются...
умножьте сначала на 1024 - и тогда получите точность = 2-3 цифры после запятой. Умножение на 1024 это сдвиг на 2 влево и введение младшего байта =0;
Можно ещё ввести коефициент поправки для корекции напряжения питания, если оно НЕ РАВНО точно 5В, а допустим 5,15В или 4,95В.
ПРИМЕР:
коеф = 255(АЦПмах) * 1024 / 5(напряжение) / 100= 522
АЦП = 249
249 *1024 = 254 976 / 522(коеф) = 488,46 = 4,88V
напряжение = 4,88V
И здесь ещё можно добавлять коефициент, что бы коруглялся меньший разряд правильно .
249 *1024 + 266 = (254 976 + 260) / 522(коеф) = 488,96 = 4,88V
напряжение = 4,88V
Как это делается:
249=F9h
умножение на 1024 это сдвигаем влево 2 раза
F9h‹2=3E4h
и допишем младший =0, получаем
3E400= 254 976
на всё это 5-6 команд асемблера
теперь делим на 522, вызывая функцию деления 24 бит на 16 бит.
НА асме всё прекрасно работает ))) а уж в СИ даже думать не нужно.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 17.06.2011 в 13:49.
|
|
|
|
16.06.2011, 20:32
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от picavr
|
Если делать С ГОЛОВОЙ, то не теряются...
|
С головой то у меня все в порядке, а вот:
Сообщение от picavr
|
а уж в СИ даже думать не нужно
|
с СИ у меня проблемы. В 65 лет не так то просто освоить этот язык, и так пытаюсь хоть что-то понять.
Если для Вас все просто, то может выложите исправленную часть кода?
Что-то я совсем запутался.
|
|
|
|
16.06.2011, 21:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Dimitrij
|
с СИ у меня проблемы. В 65 лет не так то просто освоить этот язык,
|
А вы бы ассемблер поучили )))
Я сам СИ недавно начал применять до того 12 лет асемблера ))) на СИ вычисления гораздо проще чем в асемблере.
Настраиваете АЦП на 8 битный результат в ADCH.
Обычно, результаты АЦП складываю в буфер и вычисляю среднее.
Можно ещё позаморачиваться и удалять из буфера наименьшее и наибольшее для отсеивания ошибок, но обычно не делаю.
Код:
|
//делитель
#define koef=255UL*1024*1000/5000/100;//5000 = это 5000 миливольт, подставить измереное напряжение питания, например 4,96V= число 4960
unsigned char adc_bufer[4]; //буфер
unsigned long adc_result; //для результата
//сдвиг буфера
adc_bufer[3] = unsigned int adc_bufer[2];
adc_bufer[2] = unsigned int adc_bufer[1];
adc_bufer[1] = unsigned int adc_bufer[0];
//читаем АЦП
adc_bufer[0] = ADCH;
//вычисляем суму буфера и среднее
adc_result=(adc_bufer[3]+adc_bufer[2]+adc_bufer[1]+adc_bufer[0])/4;
//вычисляем напряжение в сотых долях вольта
adc_result=adc_result*1024/koef;
//дальше преобразование в двоично десятичный вид и вывод на индикатор. |
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 16.06.2011 в 21:51.
|
|
|
|
16.06.2011, 23:04
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от picavr
|
Настраиваете АЦП на 8 битный результат......
|
Все равно получается какая-то ерунда.
Лучший вариант, что бы кто-то исправил исходый текст.
Если я засяду за изучение СИ или ассемблера, то, я так думаю, надолго заброшу все свои дела. Тем более, что программирование мне понадобится очень редко.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:30.
|
|