Jump to content
Терентенко Андрей

Влияние температуры на АЦП в РІС

Recommended Posts

Добрый день! Имею следующую ситуацию : на базе  PIC16f676  создал приблуду для "управления нештатной магнитолой с руля", а именно  сигнал с руля это 4,8в и в зависимости от нажатой кнопки падает дискретной до 0.8в мк с помощью АЦП отслеживает  на магнитолу паралельно кнопкам кинул оптрони которыми управляет МК. Питание от LM с фильтрующими конденсаторами. При тестових прогонах всё работало как надо (программно реализовано защиту от дребезга аж на 0.1 сек в поисках решений) и в машине  и от штатного БП . Но заметил закономерность сейчас на улице - 2 и при первом запуске минут 5, МК "шумит" несоотвецтвует нажатия на руле кнопке  на магнитоле ! Сигнал с руля смотрел стабильный без дребезга , притом когда тестил вынес магнитолу подключил всё работало гуд но пока устанавливал закручивал она остыла и начинались эти тацы . Кто что подскажет? МК или ЛМ могут так реагировать на температуру ? Прошу прощения у модераторов за повторение теми (может в этом разделе будет актуальней)

Share this post


Link to post
Share on other sites

А схему устройства можно показать?

Как у вас вывод VREF задействован?


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

(исходник проект в протеусе печатка остались на ноуте на роботе) набросал схему от руки , VREF- никак просто весит в воздухе ! Наверное нужно так как на втором фото ? 

IMG_20190117_105417.jpg

IMG_20190117_105852.jpg

Share this post


Link to post
Share on other sites

Вебинар "Новый BlueNRG-LP с Bluetooth 5.2 и Long Range — волшебная палочка разработчика IoT" (04/02/2021)

Приглашаем 4 февраля на бесплатный вебинар о BlueNRG-LP - новой системе-на-кристалле (SoC) STMicroelectronics. На вебинаре будут детально рассмотрены функциональные блоки, особенности подключения, аппаратные и программные средства для разработки, настройка сценариев с помощью BlueNRG-GUI, практические примеры работы с микросхемой, а также примеры применения BlueNRG-LP в устройствах интернета вещей.

Подробнее

исходник проект в протеусе печатка остались на ноуте на роботе) набросал схему от руки , VREF- никак просто весит в воздухе  (перепроверил в исходнике ) 

            banksel     ADCON1         ; переходим в регистр ADCON1
            movlw       b'00110000'   ;          vcfg-0-VDD        
            movwf       ADCON1        ; -//- ) !

или не так понял ?

 

Edited by Терентенко Андрей

Share this post


Link to post
Share on other sites

Новые компактные конденсаторы Panasonic серии TPS. Закаленный характер.

Panasonic представил новую серию TPS твердотельных танталовых конденсаторов с проводящим полимером для поверхностного монтажа. Конденсаторы серии TPS обладают уникальными особенностями, что делает их отличным выбором для использования в приложениях с высокими требованиями.

Подробнее

IMG_20190117_105852.jpg

 

Нет, на vref нужно повесить ион . Например mcp1525. И переделать инициализацию модуля АЦП. И нужно также применять хорошие резисторы в цепи делителя.


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

SiC MOSFET на 1200 В для схем флайбэк до 500 Вт!

Компания Wolfspeed выпустила новые карбид-кремниевые транзисторы C3M0350120D/J на 1200 В, предназначенные для маломощных устройств мощностью до 500 Вт. Карбид-кремниевые транзисторы в сравнении с кремниевыми демонстрируют меньший на 75% уровень потерь на переключение и меньшее на 50% значение потерь проводимости в рабочем режиме при температуре кристалла 100…150°С.

Подробнее

Спасибо ! буду пробовать переделать ! Но мне наверное больше подойдёт 1541+ минимальный делитель, (максимальное измеряемое напряжение 4.85V а опорное с MCP1541= 4.098V ) + переделка АЦП вычислений под делитель... И всё же не могу понять почему если в МК есть возможность привязаться к VDD как опорному почему такие проблемы там градация между кнопками  почти  в 1V (как на меня не мега точность при 10 разрядах)  ,  и почему оно так реагирует на температуру или я неправильно понимаю причину  проблемы? может запитать чем то более стабильным и ровным..?     

Share this post


Link to post
Share on other sites

Да, 1541 тоже хороший ион .


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites
46 минут назад, Терентенко Андрей сказал:

Спасибо ! буду пробовать

Господа, вы вообще что тут обсуждаете?  :crazy:

Какой, туды его в качель, ИОН?  :lol2:

Как вообще формируется сигнал на руле? Почему на схеме с руля идет только один проводник? Откуда руль получает питание для формирования сигнала? 

 

Share this post


Link to post
Share on other sites

Стоит штатная магнитола с неё на руль идёт питание подсветка кнопок на руле + сами кнопки ! С руля возвращается  на магнитолу для управления ею (от 4.8 до 0.75) в зависимости от нажатой кнопки на руле ! В магнитоле есть канал для подключения телефона (при замыкании определённых контактов в шлейфе магнитола переходит в режим телефон) к нему подключёна периферия которой и должен управлять МК. сигнал с руля берёста в разъёме магнитолы, питание  МК (+-12) тоже с магнитолы . Штатная магнитола работает в штатном режиме и управляться с руля тоже, при зажатии клавиши на руле и удержании более минуты МК  оптроном замыкает и переводит магнитолу в режим телефон (в этом режиме магнитола не реагирует на команды с руля кроме звука +-  а мк управляет схемой подключённой к каналу телефона  ) 

Share this post


Link to post
Share on other sites

Вся история с аналоговым интерфейсом кнопок состоит в том, что делитель напряжения на кнопках выполняется по ратиометрической схеме. Сиречь, когда опорное напряжение АЦП и является питанием делителя оных кнопок. Таким образом, на величину опорного напряжения становится БОЛТ ПОЛОЖИТЬ. АЦП измеряет не напряжение, а КОЭФФИЦИЕНТ ДЕЛЕНИЯ в аналоговом делителе кнопок. Никакого ИОН там не требуется. 

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

Что касается линии сигнала, то ИМЕННО НА ДЕЛИТЕЛЬ должны идти ТРИ ВЫДЕЛЕННЫХ проводника - общий, питание, сигнал - (причем их желательно свить, поместить в экран, который соединить с общим АНАЛОГОВЫМ проводником схемы (в районе пина AVss, либо просто Vss, если отдельного вывода AVss у МК не предусмотрено). Никакие другие "общие" проводники и уж тем более "масса" для этого не пригодны от слова СОВСЕМ.

Edited by my504

Share this post


Link to post
Share on other sites
11 минуту назад, my504 сказал:

Никакого ИОН там не требуется. 

Это радует! А то я тут уже два часа про ИОН читаю :wacko:

МК вместе с схемой размещены  в нутри самой магнитолы длина проводов не более 4 см . 

 

Основной вопрос почему (шум, дребезг, шайтан ...) только на холодную если снять магнитолу и подержать в помещении или когда в салоне малость потеплеет то работает как швейцарские часы !!! А на холодную вот такая ерунда !!!!!!!

 

Share this post


Link to post
Share on other sites

Я не понимаю как выполнена топология шин от руля к магнитоле, где размещена плата с МК.

Нужен не тот рисунок, что Вы привели выше, а указание на принадлежность земель и питаний участков схемы.  Что откуда берется и куда идет, включая провода на руль и от руля.

И то, что Вы видите никакого отношения к дребезгу не имеет.

Кроме всего прочего, измерения АЦП должны идти сплошным потоком в кольцевой буфер. После каждого измерения нужно находить среднее значение буфера. Оно и будет собственно отфильтрованным значением подлежащем анализу на предмет определения нажатия. Длина буфера должна быть выбрана такой, чтобы достаточно быстро реагировать на кнопку.  Ну, положим, 10...30 мс. Количество измерений в буфере, например, - 16. То есть каждое преобразование должно идти с интервалом 10 мс/16= 525 мкс.

Как то так.

Share this post


Link to post
Share on other sites
41 минуту назад, my504 сказал:

Никакого ИОН там не требуется. 

Ну, ну :) расскажите. 

4 минуты назад, Терентенко Андрей сказал:

Основной вопрос почему (шум, дребезг, шайтан ...) только на холодную если снять магнитолу и подержать в помещении или когда в салоне малость потеплеет то работает как швейцарские часы !!! А на холодную вот такая ерунда !!!!!!!

Кстати , эту проблему можно исправить программно . Только конечно если обвязка позволит. 4.8в формируется через делитель? Или питание там 4.8в  .

Если 4.8в через делитель , то можно использовать как калибровку при перепадах температуры . Так как при изменении температуры меняется сопротивление и соответственно напряжение . Программно нужно делать пересчет , чтобы компенсировать "уплывание" напряжения .


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites
Только что, artos5 сказал:

Ну, ну :) расскажите. 

А тут и рассказывать нечего. Без ратиометрии эта приблуда работать нормально не будет. А ратиометрии не требуется конкретная опора. Нужна лишь стабильность на интервале преобразования. Но ИОН не гарантирует низкий шум. Поэтому он тут не пришей, ни пристегни.

Share this post


Link to post
Share on other sites
2 минуты назад, my504 сказал:

Кроме всего прочего, измерения АЦП должны идти сплошным потоком в кольцевой буфер. После каждого измерения нужно находить среднее значение буфера. Оно и будет собственно отфильтрованным значением подлежащем анализу на предмет определения нажатия. Длина буфера должна быть выбрана такой, чтобы достаточно быстро реагировать на кнопку.  Ну, положим, 10...30 мс. Количество измерений в буфере, например, - 16. То есть каждое преобразование должно идти с интервалом 10 мс/16= 525 мкс.

Усреднение обязательно нужно делать . Можно и каждых 50мс усреднять по 20-40 значений , этого будет достаточно.


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites
11 минуту назад, artos5 сказал:

Можно и каждых 50мс усреднять по 20-40 значений

50 мс - это многовато. Могут успевать сформироваться промежуточные значения при росте выходного сигнала фильтра. И 20-40 тоже неудобно. Потребуется деление. значит либо 16, либо 32.

ЗЫ. Кстати. Фильтрация сигнала с аналогового делителя кнопок - это не совсем тривиальная задача. Выход КИХ ФНЧ (с прямоугольным окном), коим и является простое усреднение, дает задержку в половину длины буфера. Ответом на функцию Хевисайда (единичный перепад) будет линейный рост выходного сигнала вплоть до заполнения буфера.  а теперь подумайте что с этим делать... :bye:

Edited by my504

Share this post


Link to post
Share on other sites

Ну , я антидребезг всегда делаю на значении 50мс. Когда делал опрос при помощи АЦП , то делал по моему около 50мс.  За этот период 40 опросов и выдача усредненного результата . Можно применить ещё и чуток другой метод:

5 опросов и выдача самого среднего значения. Например так:

100

110

130

120

130

После фильтра

= 120

 

Или выдача максимально одинакового значения:

После такого фильтра:

= 130


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Это все вырванный из реальных условий пример. Я выше изложил проблему. Решите ее... :crazy:

Share this post


Link to post
Share on other sites
15 минут назад, my504 сказал:

Кроме всего прочего, измерения АЦП должны идти сплошным потоком в кольцевой буфер. После каждого измерения нужно находить среднее значение буфера. Оно и будет собственно отфильтрованным значением подлежащем анализу на предмет определения нажатия. Длина буфера должна быть выбрана такой, чтобы достаточно быстро реагировать на кнопку.  Ну, положим, 10...30 мс. Количество измерений в буфере, например, - 16. То есть каждое преобразование должно идти с интервалом 10 мс/16= 525 мкс.

Как то так.

Этого автору топика скорее всего (с долей вероятности 95%) будет недостаточно для решения его проблемы. Ему нужно кроме усреднения ввести самокалибровку . И ион лишним кстати не будет :) зря вы забраковали мое предложение (хотя для кнопок возможно ион и избыточен).


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

а можно кусок кода как усреднить в ассемблере ? У меня там  немного примитивно всё 

Скрытый текст



;===============================================
	;програми контроля напряжения на руле
   ;===============================================
	
Prov_V   
    CLRF       FL_KNOPKA ; очистка флагов кнопок перед измерениэм
    
	
    banksel     ADCON0        ; переходим в регистр ADCON0
	nop
    movlw       b'10001101'   ; правое виравнивание включаем модуль АЦП, , AN1 - вход
    movwf       ADCON0        ; -//-  
	
	call        del_20mcs

    bsf         ADCON0,1      ; включаем преобразование АЦП
    btfsc       ADCON0,1      ; ожидаем завершения
    goto        $-1           ; преобразования
 	
	CLRF	ANALIZ_H
	MOVF	ADRESH,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_H	
	
;------------------------------------------------------------------------------
	BTFSS   ANALIZ_H,0    ;  измеренное значение в регистр H = 0 (0)
	GOTO   P_X_0               ; бит0=0 на пп проверки бита1
	BTFSC   ANALIZ_H,1    ;  измеренное значение в регистр H = (0) 0
	GOTO   P_1_1               ; бит 1 =1 
	

P_0_1  ;--- бит 1=0 бит 0=1 

	bsf	    STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	    STATUS,RP0            ; вибор банка 0
	ADDLW	D'87'		; Добавили число 87 (проверка напряжениэ  више 2.07v (425))
	BTFSS	STATUS,C
	GOTO   B_1
	B_2
	bsf     FL_KNOPKA,1  ; флаг  "кнопка  (>)   нажата"
	return
	
	
	B_1
	bsf	STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	   STATUS,RP0            ; вибор банка 0
	ADDLW	D'199'		; Добавили число 199 (проверка напряжениэ  више 1.52v (425))
	BTFSC	STATUS,C
	GOTO   A_ret
	
	bsf     FL_KNOPKA,2  ; флаг  "кнопка   (+)   нажата"
	return
	
	A_ret
	bsf     FL_KNOPKA,3  ; флаг  "кнопка   (0)   нажата"
	return
	
	
	
;------------------------------------------------------------------------------


P_1_1  ; пп проверки при бит 1=1 бит 0=1 	
	
    bsf	STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	   STATUS,RP0            ; вибор банка 0
	ADDLW	D'103'		; Добавили число 103 (проверка напряжениэ  више 1.52v (773))
	BTFSS	STATUS,C
	GOTO    pysto  ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	bsf     FL_KNOPKA,4  ; флаг  "кнопка   (p)   нажата"
	return
	
	

	
;=========================================================================================================================================
	
P_X_0               ; пп проверки бита1 при бит0=0	
	
	
	BTFSC ANALIZ_H,1    ;  измеренное значение в регистр H = (0) 0
	GOTO   P_1_0               ; бит 1 =1 
	
P_0_0   ;--- бит 1=0 бит 0=0
    bsf	STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	   STATUS,RP0            ; вибор банка 0
	ADDLW	D'87'		; Добавили число 87 (проверка напряжениэ  више 1v (204))
	BTFSS	STATUS,C
	GOTO A_1
	bsf     FL_KNOPKA,2  ; флаг  "кнопка   (+)   нажата"
	return
	
	A_1
	bsf	STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	   STATUS,RP0            ; вибор банка 0
	ADDLW	D'179'		; Добавили число 179 (проверка напряжениэ  више 0.37v (76))
	BTFSS	STATUS,C
	GOTO	pysto          ;на пп "пусто"
	bsf     FL_KNOPKA,5  ; флаг  "кнопка   (-)   нажата"
	return
;------------------------------------------------------------------------------
    
    P_1_0   ;--- бит 1=1 бит 0=0 
	
	bsf	STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	   STATUS,RP0            ; вибор банка 0
	ADDLW	D'104'		; Добавили число 104 (проверка напряжениэ  више .0v (773))
	BTFSS	STATUS,C
	GOTO   A_2
	bsf     FL_KNOPKA,4  ; флаг  "кнопка   (p)   нажата"
	return
	
	
	A_2
	bsf	STATUS,RP0            ; вибор банка 1
	CLRF	ANALIZ_L
	MOVF	ADRESL,0		; Загрузили измеренное значение в регистр
	MOVWF 	ANALIZ_L
	bcf	   STATUS,RP0            ; вибор банка 0
	ADDLW	D'225'		; Добавили число 225 (проверка напряжениэ  више .v (542))
	BTFSS	STATUS,C
	GOTO  B_2
	
	bsf     FL_KNOPKA,6  ; флаг  "кнопка   (<)  нажата"
	return
	
	
pysto          ;на пп "пусто"
    bsf FL_KNOPKA,7        ; флаг НЕ нажатих кнопок
	return

 


 

а защита от "дребезга " состоит в задержке 0.1 сек (проверки условия флага сработавшей кнопки) с выходом если условие не выполнено  (кнопка скорее будет не нажата чем нажата ) но увы в протэусэ и теории это так а на практике нет!

Share this post


Link to post
Share on other sites
27 минут назад, Терентенко Андрей сказал:

а можно кусок кода как усреднить в ассемблере ?

Не знаю как на ассемблере , но на си выглядит так:

Цитата

int filtr(int data, int filtr){

Int filtr_cnt, data_buff;

data_buff+=data;

if(++filtr_cnt>filtr)data=filtr_cnt=0;

return data_buff/filtr;

}

Ps: может быть с ошибками , на скорую и с телефона написал. Но суть ясна .


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

здесь речь скорее идёт не о единичных "проскоках" а о закономерносте! притом повторюсь сигнал с руля стабилен без изменений чётко в пределах 0.05V  колебания!   Впечатление что МК просто те так считает в этот период ! при стабильном сигнале с руля может выдавать команду на один с оптронов постоянно как будто зажата какая то кнопка на руле или при нажатии одной кнопки срабатывает другая ..... и всё это пока не нагрета (проработала минут 5+- ) схема (LM8705 + PIC16f676 +PC817) всё на одной плате. 

2 минуты назад, artos5 сказал:

Не знаю как на ассемблере , но на си выглядит так

В том то и проблема что + - в ассемблере как раз плюнуть умножить пол беды а  делить целая наука, :wacko: ну по крайней мере для меня !

Ех знал бы СИ подпелил бы на ардуинке и не морочил бы вам голову :blink: 

Share this post


Link to post
Share on other sites
28 минут назад, Терентенко Андрей сказал:

У меня там  немного примитивно всё 

 у вас там бред какойто написан...  начиная с настройки АЦП:

movlw       b'10001101'   ; правое виравнивание включаем модуль АЦП, , AN1 - вход
movwf       ADCON0        ; -//-  

начнем с того что комментарий не соответствует включенному каналу  АЦП ну да бог с ним,  нахрена вообще правое выравнивание в задаче определения "трех кнопок" , для этого 8бит АЦП выше крыши и на порядок упрощает сам код обработки, самое главное  не настроено тактирование АЦП по дефолту оно у вас в запредельном режиме работает. :spiteful:

 

Share this post


Link to post
Share on other sites

 

49 минут назад, IMXO сказал:

не настроено тактирование АЦП

banksel     ADCON1         ; переходим в регистр ADCON1
            movlw       b'00110000'   ; RC- генератор,                  
            movwf       ADCON1        ; -//-

в шапке при инициализации контролера !

 

49 минут назад, IMXO сказал:

комментарий не соответствует включенному каналу  АЦП

в процессе создания печатки изменил с АN1 на АN3 комментарий не поправил ! 

49 минут назад, IMXO сказал:

нахрена вообще правое выравнивание в задаче определения "трех кнопок" , для этого 8бит АЦП выше крыши и на порядок упрощает сам код обработки

Да потому что  я профи в в этом :D:D!  Скорей от глупости точнее от незнания ассемблер и пик знаю на уроне "поморгать светодиодом" ну если так можно сказать ну как мой воспальонний мозг допЁр реализовать задуманное так и написал:wacko: 

почитал примеры там 10бит было вот по аналогии и ...

Edited by Терентенко Андрей

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения


  • Популярный USB осциллограф ISDS205A

  • Similar Content

    • By Александр Шилин
      Помогите, пожалуйста, со схемой подключения ПЗС-линейки к микроконтроллеру. Задача заключается в том, чтобы определить координату падения светового пятна, сформированного линзой, в пределах линейки.
      Модель линейки TCD132D на 1024 пикселя.
      Согласно даташиту необходимо три управляющих частоты - M, CCD, SH, питающее напряжение 12 В и опорное 5 В. Все эти условия были выполнены. Данные считываются.
      Выход данных с линейки пока просто выведен на осциллограф (красный канал). 
      Я плохо понимаю физические основы работы ПЗС-линейки, но ее работа кажется мне очень странной и нелогичной.
      1) При равномерной фоновой засветке при считывании получается равномерное низкое напряжение на всех пикселях. (Рисунок 1).
      2) При закрытии части линейки чем-либо напряжение на закрытых пикселях возрастает (Рисунок 2).
      3) При включении фонарика или лазерной указки все пиксели зашкаливают, определить максимум не удается (Рисунок 3).
      Если поместить линейку в темное место и светить очень тусклым лазером, то общий уровень напряжения на пикселях высокий, а в месте попадания света наблюдается едва заметный минимум. Возможно так и должно быть и нужно просто инвертировать и усилить сигнал?
      В чем может заключаться проблема? Как грамотно снимать выходной сигнал с линейки и заводить его на АЦП МК?
      Даташит приложен снизу.




      tcd132d.pdf
    • By Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
    • By NicksonWer
      Доброго времени!
      Суть дальнейшего моего повествования связана с наводками на прототипе фотометрического оборудования. Вот фото данного прототипа:


      Если опусти работу таких узлов как управление насосами накачки жидкости, насос откачки жидкости, управление воздушным компрессором, то суть устройства сводится к аналоговой части: ацп микроконтроллера и схемы усилителя фотодиода. Вот блок-схема и принципиальная схема усилителя фотодиода:


      Далее 6 ножка ОУ подаётся на вход ацп микроконтроллера.
      Печатные платы сделаны таким образом, что схема ОУ и фотодиод расположены на одной плате, а микроконтроллера на другой – основной плате. Плата фотодиода разведена таким образом, что вход ОУ имеет земляную петлю, нижняя сторона является общей землёй:

      В целом, эта плата работает нормально. Я ее проверял питая от аккумулятора и сигнал на выходе хороший и чистый.
       
      Проблема сама вот в чём. Что когда всё собрано во едино, а точнее, прототип запитан от внешнего сетевого адаптера от ноутбука, то сигнал превращается в бороду:

      Судя даже по этому показометру, размах равен около 35-40 мв при частоте в 50 Гц.  И когда я просто подношу ладонь к плате фотодиода на расстояние в 20-50 мм, то размах увеличивается уже за 100 мв.
      Тут нужно пояснить вот какой факт. Сейчас я питаю схему ОУ и фотодиода от отдельного аккумулятора (его видно на фото ниже), Так я думал, что питая от общего источника аналоговую часть и цифровую, даёт такой результат.

      Но как показала практика, что питать от аккумулятора, что от общего источника, результат одинаковый.
       
      Как выяснилось, даже если отключить питание от цифровой части (тумблер по положительному полюсу питания), а аналоговая питается от аккумулятора, то на показометре картина остаётся той же, видна та же борода.
      Но если выдернуть провод питания от этой конструкции, то результат на показометре следующий:

      Размах снизился до менее 10 мв и частота увеличилась примерно до 400 Гц. Вероятно тут уже собственные шумы показометра + незначительные наводки на схеме ОУ. Пока писал этот текст включил приборчик, чтобы посмотреть на его показания с отключённым щупом, вот результат:

      Вердикт.
      Проблему в том, что устройство питается от сети. Как побороть эту беду?
      P.s. Есть еще один интересный момент. Когда я пальцем дотрагиваюсь до полигона, но борода исчезает, как будто я действую как-то своей ёмкостью на схему.

      Документ Microsoft Word (2).pdf
    • By Николай кол
      Привет, у меня есть вопрос, как передать данных с микроконтроллера pic через блютуз модуль HC-05 на телефон в виде графика.Не могли бы вы показать скрипт или статю.Про Arduino много а про pic не (нужно передать данные с микроконтроллера на телефон а не на оборот).У же есть приложение на app inventor 2.Нужно примерно как тут https://www.youtube.com/watch?v=WzoCQ2fRsRQ
    • By Gerader
      Много видел схем, но, мне хочется сделать схему с обратной связью (т. е. температуру установил жало нагрелось до нужной t° и питание отключилось, жало остыло, питание включилось) а не с ограничением мощности на симисторе.
      Помогите пожалуйста, буду очень рад и благодарен!
×
×
  • Create New...