Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Изменить исходный код программы для ATMEGA8

Непрочитано 15.06.2011, 23:54  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Изменить исходный код программы для 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 и на всякий случай схемой устройства.
Вложения:
Тип файла: zip 01.zip (192.6 Кб, 189 просмотров)
Реклама:
Dimitrij вне форума  
Непрочитано 16.06.2011, 00:33  
svd71
Временная регистрация
 
Регистрация: 17.09.2009
Сообщений: 68
Сказал спасибо: 13
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
svd71 на пути к лучшему
По умолчанию Re: Изменить исходный код программы для ATMEGA8

смущает то, что у тебя получается сейчас измерение, почти в половину меньше, чем действительно. За исключением 25.5 * 2 = 51, а не 50.
Это похоже на шумы. Дело в том, что ADCW - 16ти-битный, а сам АСП дает 10 бит. я не вижу у тебя подавление лишних разрядов.
PS: сам, правда, с АЦП еще не ковырялся. Знаю только по даташитам и статьям, но может и прав.
__________________
svd71 вне форума  
Непрочитано 16.06.2011, 11:17  
MisterDi
Почётный гражданин KAZUS.RUN
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,284
Сказал спасибо: 441
Сказали Спасибо 1,040 раз(а) в 701 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Изменить исходный код программы для ATMEGA8

Цитата:
Удваивал результат вывода на индикаторы
в младшем разряде отображаются только четные цифры.
Все правильно, у четных чисел самый младший разряд = 0, Отобразить нечетные не позволяет разрядность АЦП или нужно использовать 10-битовый режим.
ИМХО проще на входе АЦП поставить делитель, и добиться чтобы при 5В входного АЦП показывал 250, а уже после этого удваивать. Если особая точность не важна, то можно оставить и так. получаем порядка 2% ошибки
__________________
misterdi<@>i.ua
MisterDi вне форума  
Непрочитано 16.06.2011, 14:50  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Изменить исходный код программы для ATMEGA8

Сообщение от MisterDi Посмотреть сообщение
поставить делитель, и добиться чтобы при 5В входного АЦП показывал 250, а уже после этого удваивать
Ещё можно делить и умножать на кооефициент что б не морочится с делителями. В СИ это проще чем в асме. Только не забывать, что функция деления займёт програмную память.
Либо строить делитель либо отдать кусок памяти.

КОЭФ для напряжения = 255/50 = 5,1
напряжение = АЦП/5,1

КОЭФ для тока = 255/5 = 51
ток = АЦП/51
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Непрочитано 16.06.2011, 15:14  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Сделайте всё по-честному,

без наворотов.

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.
=GM= вне форума  
Сказали "Спасибо" =GM=
Dimitrij (19.06.2011)
Непрочитано 16.06.2011, 18:16  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию 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.
Dimitrij вне форума  
Непрочитано 16.06.2011, 19:03  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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.
picavr вне форума  
Непрочитано 16.06.2011, 20:32  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Изменить исходный код программы для ATMEGA8

Сообщение от picavr Посмотреть сообщение
Если делать С ГОЛОВОЙ, то не теряются...
С головой то у меня все в порядке, а вот:
Сообщение от picavr Посмотреть сообщение
а уж в СИ даже думать не нужно
с СИ у меня проблемы. В 65 лет не так то просто освоить этот язык, и так пытаюсь хоть что-то понять.
Если для Вас все просто, то может выложите исправленную часть кода?
Что-то я совсем запутался.
Dimitrij вне форума  
Непрочитано 16.06.2011, 21:49  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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.
picavr вне форума  
Сказали "Спасибо" picavr
Dimitrij (19.06.2011)
Непрочитано 16.06.2011, 23:04  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Изменить исходный код программы для ATMEGA8

Сообщение от picavr Посмотреть сообщение
Настраиваете АЦП на 8 битный результат......
Все равно получается какая-то ерунда.
Лучший вариант, что бы кто-то исправил исходый текст.
Если я засяду за изучение СИ или ассемблера, то, я так думаю, надолго заброшу все свои дела. Тем более, что программирование мне понадобится очень редко.
Dimitrij вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Апгрейд и комплектующие для ноутбуков mikesmith Барахолка электронных компонентов 28 17.05.2023 23:25
из DVD в DVD-player реально? Altalimir Микроконтроллеры, АЦП, память и т.д 14 17.09.2007 21:21
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49


Часовой пояс GMT +4, время: 22:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.