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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Изменить исходный код программы для ATMEGA8

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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot