Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93

1886ВЕ61У1 использование АЦП

23.12.2015, 16:42. Показов 3802. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
Используется указанный в заголовке контроллер. Необходимо получит на вход АЦП контроллера преобразованное в цифровой сигнал напряжение и отправить по RS485 на компьютер.
Значение напряжения получаю с помощью регистра ADRESH. Далее его присваиваю переменной unsigned char TMP и отправляю с помощью регистра TXREG1. И жду установки флага отправки.
PA2, PA3 настроены на выход. АЦП настроено так, что все, кроме 7 бита порта C настроены на вход.
Вообщем, передача данных настроена вроде правильно и работает, если отправляет числа (15,14,13 и т.д.). Проблема заключается в том, что при отправки значение напряжения TMP на компьютере получаю число 63(или $).
Код работы с АЦП:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     DDRA = 0b00000011;                                                             //настроил порт а: ПортА1 и ПортА2 - входы, остальные выходы
     DDRC = 0b01111111;                                                             //порт с: по соответствию с ПортА
     ADCON1 = 0b10000010;                                             //настроил ацп
     ADCON0 = 0b00000001;                                            //тоже ацп
 
                 TMR0L = 0xFA;                          //
                 TMR0H = 0xFF;                          //ЗАДЕРЖКА
                 T0IF = 0;                                  //
                 while(!T0IF){}                           // 
 
                 GO_DONE = 1;                                              //устанавливаю бит начала получения сигнала из АЦП
                 while(GO_DONE){}                                          //  жду пока закончу получать          
                 tmp1 = ADRES;                                            //как получил, присвоил значение переменной TMP
//далее код отправки
         PORTA.6 = 1;                                             //разрешил передачу 5559ИН28У
         TXREG1 = tmp1;                                         //записал в рег. передатчика
         TXSTA1.5 = 1;                                            //установил бит разрешения передачи (или бит TXENx)                      
         while(!TRMT1){}                                         //жду, пока передастся
Добавлено через 7 минут
А иногда вообще получаю отрицательные числа, хотя отправляю unsigned char
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2015, 16:42
Ответы с готовыми решениями:

Использование АЦП в STM32f103
Пытаюсь измерять напряжение на первом канале. Не идет. Где косяк? //************** Инициализация АЦП ************** ...

Использование нескольких каналов АЦП
Всем привет. Пишу небольшую прогу для ATmega8, и возник вопрос как считывать данные сразу с двух (ну или с нескольких) каналов АЦП,...

Использование несколькх АЦП ATtiny13
Здравствуйте! Начал изучать программирование микроконтроллеров на Си и столкнулся со следующей проблемой - пытаюсь организовать...

23
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,696
23.12.2015, 18:10
Скорость передачи до компьютера какая?
Частота кварцевого стабилизатора какая?
Можно использовать передачу по USORT в 1886ВЕ61У1 через прерывание?
Где вы на 1886ВЕ61У1 нашли документацию?
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
23.12.2015, 18:37  [ТС]
Скорость 9600
Кварц 24мгц
Документация в гугле 1886ве6 она для всей серии похожа.
Прерывания от параллельного можно
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,696
23.12.2015, 18:56
А какое у вас значение регистра SPBRG?

скорость передачи для асинхронного режима (в том числе LIN) = FOSC /
(32*((SPBRGx)+1)), значение (SPBRGx) от 0 до 255;
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
23.12.2015, 20:28  [ТС]
299. Да с передачей вроде нет проблем. Обычные числа передаются нормально. Проблема с ацп я думаю
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,696
23.12.2015, 20:54
Максимальное значение которое может содержать регистр SPBRG это число 255, а у вас 299?
Допустим компилятор откомпилировал код со значением SPBRG=299 но принял 8 бит значения из числа 299 это будет 43
24 000 000Гц/(32*(43+1))=17045,45454545455 бит/с

Для АЦП скольки разрядный регистр ADRES?
Если данные АЦП записываются в два 8 битных регистра ADRESH:ADRESL значит ADRES 16 битный и по коду вы его передаёте в переменную tmp1 а потом пытаетесь передать это значение в 8 битный регистр TXREG1.
1
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
24.12.2015, 08:47  [ТС]
по поводу скорости я че-то сам не понял почему 299) сейчас исправлю. А для приема данных использую лишь старшие разряды регистра ацп - 8 бит, ну тут тоже вижу ошибку. Сейчас все исправлю и сообщу о результате спасибо.
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
24.12.2015, 09:07  [ТС]
так, теперь для передачи полученного значения напряжения использую переменные uns8, получаю значение из ацп в рег ADRESH. В рег SPBRG1 передаю 77.
Вот у меня написана программка под Win, которая должна принимать по rs485 данные и записывать их в датагрид. Эта программка работает след. образом. Приходит первое сообщение с данными, в котором указан номер строки датагрида и как я понимаю программа понимает это сообщение. А следующее за ним сообщение программа должна воспринимать как значение напряжения, которое нужно записать. Но приходят неведомые числа. И я думаю, что у меня проблемы с рег ADRESH, содержимое которого я пытаюсь отправить в эту программу. Просмотрев приходящие данные, используя сторонние терминалы, я увидел, что приходят отрицательные значения, которые моя программка просто не воспринимает. Вопрос откуда там приходят отрицательные значения, если даже к каналу, с которого должно считываться напряжение ничего еще не подключено. Я думал в таком случае в ADRESH должен быть 0. А приходят неведомые отрицательные числа.
Миниатюры
1886ВЕ61У1 использование АЦП  
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
24.12.2015, 11:56  [ТС]
Возник вопрос по поводу бита ADFM регистра ADCON1. Выравнивание регистра ADRES. Что это и где тогда будет результат.

Добавлено через 2 часа 12 минут
Вообщем, у меня походу непонятки с АЦП. Объясните пожалуйста. Вот, как делаю я
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DDRC = 0b01111111;  //Настроил выводы с 0 по 6 как входы
ADCON1 = 0b10100010;   //источник имп FC/64, правое выравнивание ADRES, все входы аналоговые
ADCON0 = 0b00000001;       //вкл ацп 
ADCIF = 0;           //прерывания от ацп не надо 
CHS0 = 0;//выбрал первый канал an0
CHS1 = 0;//
CHS2 = 0;//
TMR0L = 0xFA;    //задержка примерно 25мкс. требуется для заряда конденсатора C(hold)
TMR0H = 0xFF;   //
T0IF = 0;           //
while(!T0IF){}    // 
ADRESL = 0;       //на всякий случай занулил выходной регистр
GO_DONE = 1;            //дал команду для начала получения значения
while(GO_DONE){}       //подождал конца преобразования           
tmp1 = ADRESL;
//переменной типа uns8 присвоил значение регистра
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,696
24.12.2015, 17:27
Это вам для дальнейшего можно сразу передавать TXREG1 = ADRESL. Не обязательно через переменную.
Аналоговые порты АЦП микроконтроллера очень чувствительные к внешним источникам помех и если не подтянуть входы АЦП через скажем 1 кОм-ные резисторы к минусу то у вас постоянно будут сыпаться из ADRESL различные данные произвольной формы.
1
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
25.12.2015, 15:34  [ТС]
Еще один вопрос. Я сделать так, чтоб данные с ацп получались в регистре ADRESH - в старших битах регистра ADRES. Я хотел бы спросить в каком формате будет число, которое я получу.. целое или с запятой, если с запятой, то в как отбросить то, что после нее.

Добавлено через 6 часов 15 минут
Новый вопрос) Разрядность ацп 12. Диапазон входных напряжение от 0 до 5 вольт. Почему ацп не воспринимает напряжение 0.3 ? а точнее в программе я просто получаю 0.

Добавлено через 15 минут
И еще один. в ацп приходит допустим напряжение 0.6В . Как это число будет записано в регистр ADRES, если я установил левое выравнивание. Можно ли умножить значение этого регистра на 100 допустим... и взять целую часть? Просто изначально напряжение больше, но перед входами в ацп стоят делители напряжения. Это сделано ввиду того, что контроллер не может принят напряжение 60 или 30. Только от 0 до 5В. И мне нужно получить изначальное значение.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.12.2015, 15:36
Цитата Сообщение от IngProj Посмотреть сообщение
не воспринимает напряжение 0.3 ? а точнее в программе
ни схемы, ни программы, ни места замера... вы все еще хотите хоть каких-то содержательных комментариев? Значит поделитесь информацией.
Иначе на вопрос почему остается ответить: "потому что".
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
25.12.2015, 19:42
Лучший ответ Сообщение было отмечено IngProj как решение

Решение

Цитата Сообщение от IngProj Посмотреть сообщение
Можно ли умножить значение этого регистра на 100 допустим... и взять целую часть?
можно,если вас не интересует результат
откуда взялось сто?
если немного почитать про теорию АЦП то будет ясно что есть частота дискретизации(сейчас нас не интересует)
шаг дискретизации, это опорное напряжение деленное на разрядность
например опорное напряжение 5 вольт, разрядность 8 бит итого 5/28=5/256=0,01953125
каждый отсчет равен 0,01953125 вольт
1
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,696
25.12.2015, 20:38
И всё это передавать на скорости 9615 на компьютер который принимает на скорости 9600. Будут проскакивать ошибки и новые вопросы.
IngProj, изучайте передача/приём данных USORT через прерывание.
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
26.12.2015, 00:00
Цитата Сообщение от VladimirU Посмотреть сообщение
передавать на скорости 9615 на компьютер который принимает на скорости 9600.
Синхронизация байта в UART происходит по спаду старт-бита. Опрос состояния бита - на середине предполагаемого бита. Соответственно, для нормальной передачи байта (то есть 9 бит) время передачи не должно "сползать" больше, чем пол-бита за время передачи одного байта. Короче, примерно 5% разницы между частотами приемника и передатчика USORT должен выдерживать. Это значит, что при скорости 9600 расхождение передатчика и приемника может быть +-48бод. Так что при 9615 будет нормально работать, если битрейт ответной стороны ровно 9600.
1
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
28.12.2015, 09:21  [ТС]
Я во многом разобрался. Полученное значение из ацп умножаю на квант. Как раз получаю необходимые мне значения. Но почему-то 0.3 ацп все равно воспринимает как 0, хотя квант намного меньше. Время ещё есть подумаю) спасибо за советы и ответы)

Добавлено через 8 часов 38 минут
Даже точнее до 0.7В АЦП не воспринимает. Напряжение подаю тупо напрямую во вход АЦП контроллера. Более 0.7 приходят значения.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,696
28.12.2015, 21:55
Хоть бы схему приложили как вы там на вход АЦП напряжение подаёте?
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
11.01.2016, 08:52  [ТС]
Снимаем напряжение U
Миниатюры
1886ВЕ61У1 использование АЦП  
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
11.01.2016, 08:55  [ТС]
еще диод стоит перед входом АЦП забыл нарисовать в сторону входа

Добавлено через 1 минуту
Да и эта схема не важна. я напрямую в МК пробовал подавать напряжения от 0 до 5. И до 0.7 МК думает, что приходит 0.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
11.01.2016, 09:04
Цитата Сообщение от IngProj Посмотреть сообщение
И до 0.7 МК думает, что приходит 0.
0.7 волшебное число для полупроводников, особливо для кремния
посему перечитай еще раз описание на МС, может там описан диапазон
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2016, 09:04
Помогаю со студенческими работами здесь

AVR АЦП использование нескольких каналов
Кто пробовал использовать несколько каналов АЦП одновременно (ну, почти одновременно) - как это делать правильно? Используется два...

АЦП и oversampling: использование синуса в качестве шума
Всем здравствуйте! Мучает меня один вопрос: можно ли в качестве шума для подмешивания к полезному сигналу использовать синус. Вкратце...

Использование и настройка АЦП STM32F407G-Discovery в nanoFramework
Добрый день. Объект: STM32F407G-Discovery + ChibiOS + nanoFramework, подключены только USB-разъёмы. Пытаюсь использовать...

Использование USB снижает количество отсчётов АЦП
Здравствуйте! Я использую USB как отладочный интерфейс на плате с ATXmego32a4u. В основном цикле программы я опрашиваю АЦП и...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864 точках, и вывода их на дисплей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru