1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
1 | |
Работа с АЦП PIC16F68826.02.2015, 20:49. Показов 2558. Ответов 18
Метки нет (Все метки)
Здравствуйте!
Подскажите пожалуйста мне про АЦП. Если используем левое выравнивание, то надо использовать только H? но тогда ведь не точно вообще будет. будет какая-то ерунда... Если же использовать правое выравнивание, то неизвестно как считать.... Ведь 2 регистра по 8 бит, а результат то 10 битный.... + Код
rezultat=ADRESH; volt=(float)rezultat*5/1023; sprintf(otvet,"%.2f", rezultat); lcd_puts(otvet); Однако если вместо %f поставить %d, то ошибок нет. но полная ерунда вообще становится....
0
|
26.02.2015, 20:49 | |
Ответы с готовыми решениями:
18
Змейка и тетрис на PIC16F688 Кто работал с PIC16F688? Внутренний генератор в PIC16F688 Змейка и тетрис на PIC16F688 |
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||
26.02.2015, 21:21 | 2 | |||||
иногда достаточно 256 уровней
что такое битовые маски слышал?
а что ты выводишь то в sprintf ??? rezultat а он INT float то volt
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
26.02.2015, 21:27 [ТС] | 3 |
Ой, это от моих эксперементов. Там где rezultat конечно у меня стояло volt и все равно ошибка.
Покажите пожалуйста как считать надо я додуматься не могу Нет, не слышал.
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
||||||
26.02.2015, 22:10 [ТС] | 5 | |||||
Я все равно не понял. Прошу пояснить.
0
|
Нарушитель
179 / 164 / 30
Регистрация: 14.02.2013
Сообщений: 1,472
|
|
26.02.2015, 22:39 | 6 |
В некоторых библиотеках нет возможности использовать функцию sprintf для микроконтроллеров PIC16.
Используйте функцию void FloatToStr(float number, char *output); Функция создает выходную строку output для числа с плавающей точкой number. Выходная строка содержит нормализованный формат числа number (мантисса в диапазоне от 0 до 1) со знаком в крайней левой позиции. Мантисса имеет фиксированный формат длиной 6 цифр, 0.ddddd т.е. после точки всегда следуют 5 десятичных цифр. или МК PIC18 и выше.
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
26.02.2015, 23:24 [ТС] | 7 |
Владимир, так с int у меня же работает...
Мне надо, чтобы 2 числа после запятой было, а не 5) Мне надо бы сделать на дешевом микроконтроллере, для этого вполне подходит 688.
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||
26.02.2015, 23:42 | 8 | |||||
user437, используйте целочисленные значения, это сэкономит вам нервы и много-много памяти контроллера .
Скажем, объявите signed long int volt; и работайте со значениями, умноженными на 1000. (то есть в милливольтах). И "округляйтесь" при выводе. Например:
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
26.02.2015, 23:55 [ТС] | 9 |
Как я понял мои ошибки связаны с тем, что памяти не хватает. Да сколько же ему надо то тогда?! 4К мало для преобразования? Как же тогда это делать....
Сколько так будет? Мне надо 2 знака после запятой. Добавлено через 5 минут можно сделать тогда так: например так: 10/3=3.333333....= нам надо вывести значение 3.33 Мы делаем целочисленными (т. к. памяти не хватает) int a=10/3 Потом как то (как?) 10/3=.3333333....чтоб было -- найти деление И в выводе это самое деление сократить до 2х чисел не знаете тогда как это организовать?
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
27.02.2015, 00:32 [ТС] | 11 |
Валерий, спасибо. Вроде как работает....
Остается понять как считать с правым сдвигом и почему с левым сдвигом считается более стабильным измерением. Добавлено через 5 минут Я еще один способ нашел. Завтра испробую. Если заработает и не забуду, то выложу.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
27.02.2015, 00:34 | 12 |
потому что выбрасываются младшие разряды в которых чаще всего шум
плюс ошибки дискретизации, в измерительных приборах никогда не учитывают младший разряд по правильному 10-разрядную АЦП нужно считать 9 разрядной
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
27.02.2015, 10:16 [ТС] | 13 |
потому что выбрасываются младшие разряды в которых чаще всего шум
Тогда надо наверное отбрасывать младшие разряды H - регистра, нежели старшие биты L-регистра
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|||||||||||
27.02.2015, 11:04 | 14 | ||||||||||
так в H - регистре будут 8 старших разрядов отсчета а в L- 2 младших
вот так примерно влево
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
||||||
01.03.2015, 11:34 [ТС] | 15 | |||||
Валерий, неприятность у меня... На вход подключаю делитель напряжение (коэффициент деления 4)
Получается предварительно умножаю ADRESH*4 и делаю все тоже самое, что и без этого... Должно получиться 11.92, а у меня 11.-1192 ... Если же умножать не на 100, а на 10, то нормально выводится 11.9 Почему так?
AND почему-то выводы у которых написано C1(C2) OUT(IN) помечены как неопределенные в протеусе, хотя, хотя с ним можно снять показания АЦП.... Что это за выводы и как отключить эти Цэшки?
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
01.03.2015, 12:05 | 16 |
...переполнение у вас происходит. Смените тип int на signed long для переменных. И посмотрите строчку, которую советовал вам я выше. там дробная часть выводится по модулю, а вычисления дробной части сводятся к определению остатка от деления функцией "%" в сях, а не вычитанием целочисленной части из общего числа. Так проще в записи и меньше строчек.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|||||||||||
01.03.2015, 12:17 | 17 | ||||||||||
что ж ты два раза считываешь ??? во второй раз там может быть совершенно другое
размерность у переменных какая? Добавлено через 3 минуты деление, чаще всего дороже, умножения и вычитания мне один раз пришлось делать через цикл(на AVR) уж очень тормозила % Добавлено через 4 минуты а это мысль если только исходные данные в миливольтах
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
01.03.2015, 13:48 | 18 |
Да, действительно. Как-то не подумал. Запись '%' гораздо лаконичнее, чем вычисление остатка. В принципе если гнаться за производительностью, то и printf в данном случае не подходит.
Без вычисления остатков можно сделать так: 1) Умножаем показания АЦП на 10 в степени количества знаков после запятой. Если нужно два знака - умножаем на 100. 2) Делим результат на делитель, сопоставляющий выводимую единицу измерения с "попугаями" шкалы АЦП. 3) Выводим результат в текстовый буфер, со знаком. 4) Считаем количество байт в получившейся строке - N. 5) Выводим: Первые N-2 символов, потом точку, затем оставшиеся символы.
0
|
1 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 100
|
|
01.03.2015, 15:14 [ТС] | 19 |
тоже самое же, только больше переменных.
Еслиб было бы переполнение, то наверное ostatok=ADRESH*7.84313724-celoe*100; не помогло бы. Но мне такая запись не очень нравится. Итак, ребята -- в чем проблема тогда получается и каково решение?
0
|
01.03.2015, 15:14 | |
01.03.2015, 15:14 | |
Помогаю со студенческими работами здесь
19
Работа с АЦП ADuC842 Работа с АЦП (PIC16F676) ATtiny13. Работа с АЦП (Си) Работа с АЦП микроконтроллером PIC Контроль светодиода кнопкой (PIC16F688, MPLab X, XC8) PIC16F688 и SIM900D Работа АЦП Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |