Jump to content
Пентагрид

управление БП через оптрон + PIC16F628A

Recommended Posts

Решил собрать источник питания с управлением через PIC16F628A (парой кнопок переключать нужные напряжения). Взял обычный импульсник на 15 В, из обратной связи выдрал TL431, оставил оптрон, его повесил на выход МК. Написал тестовую прошивку: задаётся Vref через VRCON, компаратор сравнивает и выдаёт на оптрон 1 или 0.

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

МК питаю отдельно (тлф. зарядка с домотанной вторичкой + 7805). Несколько раз прошёлся по прошивке, не нашёл за что зацепиться. Прошу совета.

Схема

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

5c744667866cf_.thumb.JPG.0f70dc6f63691c6d8b39834f7bfab079.JPG

В коде присутствуют рудименты для кнопок (пока не вводил).

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

;4 MHz
;компаратор 2 - -RA1, +RA2, выхRA0
 RA2 ничего не подключать!
;MCLR - сброс в ноль

list	p = 16f628a
#include <p16f628a.inc>

__CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

#define	up	PORTA,7
#define	down	PORTA,6
#define	sd	PORTA,0

CBLOCK 70h
Reg_1	:1
Reg_2	:1
Reg_3	:1
ENDC


;переход к основной программе
org	0000h
goto	start


;переход к прерыванию
org	0004h
btfsc	CMCON,7	;обработка прерываний (опрос компаратора и вывод ОС)
goto	sd_0
goto	sd_1

sd_0:			;есть накачка
bcf	sd
goto	komp_end

sd_1:			;нет накачки
bsf	sd
goto	komp_end

komp_end:
bcf	PIR1,6

retfie
;конец обработки прерываний


;основная программа - инициализация МК
start:
BCF	INTCON,GIE	;глобальное запрещение прерываний
BCF	INTCON,PEIE	;запретить прерывания от периферийных модулей
CLRF	PORTA		;инициализация PORTA
clrf	PORTB

MOVLW	b'00000101'	;использовать только 2 компаратор
MOVWF	CMCON
BSF	STATUS,RP0	;банк 1 (TRISA, VRCON)
bsf	TRISA,1		;настройка пинов
bcf	TRISA,0


MOVLW	b'11101110'	;включитьVREF, RA2, нижн.диап., 
MOVWF	VRCON		;14В (2,92В)
BCF	STATUS,RP0	;банк 0 (порты)
CALL	delay_10mks	;задержка 10 мкс

MOVF	CMCON,F	;чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;сбросить флаг прерываний
BSF	STATUS,RP0	;банк 1
BSF	PIE1,CMIE	;разрешить прерывания от модуля компараторов
BCF	STATUS,RP0	;банк 0
BSF	INTCON,PEIE	;Разрешить прерывания от периферийных модулей
BSF	INTCON,GIE	;Глобальное разрешение прерываний

bsf	STATUS,RP0
movlw	0x00		;PORTB - выход
movwf	TRISB
bcf	STATUS,RP0
;конец инициализации МК
bcf	PIR1,6
;пусковой вызов ОС (без него не заработает до нажатия кнопок up/down)
btfsc	CMCON,7
goto	sd_0_first
goto	sd_1_first

sd_0_first:
bcf	sd
goto	komp_end_first

sd_1_first:
bsf	sd
goto	komp_end_first

komp_end_first:
bcf	PIR1,6
;конец пускового вызова ОС


main:
nop
nop
nop
goto	main



;подпрограммы задержек
delay_10mks:
movlw	.3
movwf	Reg_1
decfsz	Reg_1,F
goto	$-1
return


END

 

 

comp5nop.rar

Share this post


Link to post
Share on other sites

В ассемблере не силен , но за темой буду следить . У самого намечается подобная задача :)

Share this post


Link to post
Share on other sites
start:
BCF	INTCON,GIE	;глобальное запрещение прерываний
BCF	INTCON,PEIE	;запретить прерывания от периферийных модулей

заменить на

start:
clrf	INTCON	;глобальное запрещение прерываний
banksel PIE1	;запретить прерывания от периферийных модулей
clrf    PIE1 ;

какое отношение эта настройка компаратора 

MOVLW	b'00000101'	;использовать только 2 компаратор
MOVWF	CMCON

имеет к внутреннему ИОН? при этой настройке задействованы входы RA1 и RA2 , RA2 и вас в схеме ваапче не задействован.

требование ДШ об устранении несоответствия 

MOVF	CMCON,F	;чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;сбросить флаг прерываний

при инициализации выполнили,  а в прерывании значит это уже делать недада?

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

11 час назад, IMXO сказал:

требование ДШ об устранении несоответствия

Добавил, не заработало. Перепроверю сам БП, есть подозрения на ШИМку. Буду использовать вариант с прямым подключением выхода компаратора к пину.

 

11 час назад, IMXO сказал:

RA2 и вас в схеме ваапче не задействован

Бит VRCON,6=1 подключает ИОН к RA2, т.е. он идёт на вход компаратора внутри МК.

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

Это твои опыты показывают. Мои например опыты отличаются от твоих , причем в противоположную сторону .

Share this post


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

причем в противоположную сторону

Получилось что-нибудь работоспособное с прерыванием?

Share this post


Link to post
Share on other sites

Ну естественно , как же без них любимых?))

При помощи прерываний можно из невозможного сделать возможное !

Share this post


Link to post
Share on other sites

Лучше изучай си , он не привязан к архитектуре так как ассемблер . Ассемблер для критичных к исполнению вещей . Через пару лет будут поголовно 32х битки , и о ассемблере мало кто будет вспоминать.  Я и на си успешно решаю много задач. 

1 минуту назад, Пентагрид сказал:

выкладывай

Что именно? У меня много чего на прерываниям есть. И все отлично работает !

Share this post


Link to post
Share on other sites
21 минуту назад, Пентагрид сказал:

работоспособное с прерыванием?

У меня даже где-то есть решение софтово стабилизатора тока на attiny13A

Share this post


Link to post
Share on other sites

Похоже, проблема была в конфигурационных файлах проекта (переносил и компилировал на разных компьютерах) и/или "пусковой ОС". Откатил и написал для прерываний заново (без пусковой ОС), теперь работает.

Вариант с прерыванием. Работает только при наличии серьёзной нагрузки, в противном случае через 5 сек напряжение падает до нуля и МК не реагирует на подключение нагрузки. Можно применять, если по ходу кода будет хоть раз проводиться программный опрос в течение упомянутого времени.

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

;4 MHz
;компаратор 2 - -RA1, +RA2, выхRA0
;к RA2 ничего не подключать!

list	p = 16f628a
#include <p16f628a.inc>

__CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

CBLOCK 20h
Reg_1	:1
Reg_2	:1
Reg_3	:1
ENDC

ORG	0
goto	start

ORG	4

btfsc	CMCON,7	;обработка прерываний (опрос компаратора и вывод ОС)
goto	sd_0
goto	sd_1

sd_0:			;есть накачка
bcf	PORTA,0
goto	komp_end

sd_1:			;нет накачки
bsf	PORTA,0
goto	komp_end

komp_end:
MOVF	CMCON,F
bcf	PIR1,6

retfie

start:
BCF	INTCON,GIE	;Глобальное запрещение прерываний
BCF	INTCON,PEIE	;Запретить прерывания от периферийных модулей
CLRF	PORTA		;Инициализация PORTA
clrf	PORTB

MOVLW	b'00000101'	; 2 аналоговых входа
MOVWF	CMCON		; только 2-й компаратор
BSF	STATUS,RP0	; Выбрать Банк 1
bsf	TRISA,1
bcf	TRISA,0

MOVLW	b'11101001'	; включитьVREF, RA2, нижн.диап., 
MOVWF	VRCON		; 1,88В (9В)
			; установить VR<3:0>=6
BCF	STATUS,RP0	; Выбрать Банк0
CALL	delay_10mks	; задержка 10 мкс

MOVF	CMCON,F	;Чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;Сбросить флаг прерываний
BSF	STATUS,RP0	;Выбрать банк 1
BSF	PIE1,CMIE	;Разрешить прерывания от модуля компараторов
BCF	STATUS,RP0	;Выбрать банк0
BSF	INTCON,PEIE	;Разрешить прерывания от периферийных модулей
BSF	INTCON,GIE	;Глобальное разрешение прерываний

bsf	STATUS,RP0
movlw	0x00
movwf	TRISB
bcf	STATUS,RP0


komp2_pusk:			;проверка компаратора 2
btfsc	CMCON,7
goto	sd2_0_pusk
goto	sd2_1_pusk

sd2_0_pusk:
bcf	PORTA,0
goto	manolo

sd2_1_pusk:
bsf	PORTA,0
goto	manolo

manolo:
nop
nop
nop
goto	manolo

;подпрограммы задержек
delay_10mks:
movlw	.3
movwf	Reg_1
decfsz	Reg_1,F
goto	$-1
return

END

 

 

Вариант с циклической проверкой. Надёжно работает с нагрузкой и без, подключением и отключением в процессе работы. Без нагрузки напряжение гуляет в пределах 1 В,  с нагрузкой -- стабильно. Похоже, придётся вывести его в подпрограмму и вызывать везде, где только возможно зацикливание (опрос кнопок и т.п.).

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

;4 MHz
;компаратор 2 - -RA1, +RA2, выхRA0
;к RA2 ничего не подключать!

list	p = 16f628a
#include <p16f628a.inc>

__CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

CBLOCK 20h
Reg_1	:1
Reg_2	:1
Reg_3	:1
ENDC

ORG	0
goto	start



start:
BCF	INTCON,GIE	;Глобальное запрещение прерываний
BCF	INTCON,PEIE	;Запретить прерывания от периферийных модулей
CLRF	PORTA		;Инициализация PORTA
clrf	PORTB

MOVLW	b'00000101'	; 2 аналоговых входа
MOVWF	CMCON		; только 2-й компаратор
BSF	STATUS,RP0	; Выбрать Банк 1
bsf	TRISA,1
bcf	TRISA,0

MOVLW	b'11101001'	; включитьVREF, RA2, нижн.диап., 
MOVWF	VRCON		; 1,88В (9В)
			; установить VR<3:0>=6
BCF	STATUS,RP0	; Выбрать Банк0
CALL	delay_10mks	; задержка 10 мкс

MOVF	CMCON,F	;Чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;Сбросить флаг прерываний
;BSF	STATUS,RP0	;Выбрать банк 1
;BSF	PIE1,CMIE	;Разрешить прерывания от модуля компараторов
;BCF	STATUS,RP0	;Выбрать банк0
;BSF	INTCON,PEIE	;Разрешить прерывания от периферийных модулей
;BSF	INTCON,GIE	;Глобальное разрешение прерываний

bsf	STATUS,RP0
movlw	0x00
movwf	TRISB
bcf	STATUS,RP0


komp2:			;проверка компаратора 2
btfsc	CMCON,7
goto	sd2_0
goto	sd2_1

sd2_0:
bcf	PORTA,0
goto	komp2

sd2_1:
bsf	PORTA,0
goto	komp2


;подпрограммы задержек
delay_10mks:
movlw	.3
movwf	Reg_1
decfsz	Reg_1,F
goto	$-1
return

END

 

 

comp666interrupt.rar

comp777cycle.rar

Share this post


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

Похоже, придётся вывести его в подпрограмму и вызывать везде, где только возможно зацикливание (опрос кнопок и т.п.).

Какое зацикливание?? Сделайте все на прерываниях и будет все на автомате работать!

Share this post


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

будет все на автомате работать

Без нагрузки вырубается. Надо подобрать холостую нагрузку в разумных пределах потребления.

Share this post


Link to post
Share on other sites
4 минуты назад, Пентагрид сказал:

Надо подобрать холостую нагрузку

Так надо цеплять нагрузочный резистор , порядка 51 - 100 Ом при 12в питании .

 

Так вырубаться не должно ! Будут колебания , но вырубаться ничего не должно :) что то не так или с кодом инициализации или с алгоритмом реализации стабилизатора / обратной связи .

Share this post


Link to post
Share on other sites

@artos5 , ради стабильности можно и 50 Ом. Похоже, мне придётся опять вернуться к варианту с прерыванием.

 

Пока тестировал вариант с кнопками и циклическим опросом. Запуск с Vref=0, потом можно переключать кнопками вверх/вниз с шагом 1 В. Без нагрузки всё норм, но с нагрузкой работает только начиная с 9 В, ниже вольтметр не показывает, трансформатор пищит с одной периодичностью. Это похоже на постоянный сброс? Каково Ваше мнение о причинах такой лажи на низких напряжениях?

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

;4 MHz
;компаратор 2 - -RA1, +RA2, выхRA0
;RA7-up, RA6-down
 RA2 ничего не подключать!

list	p = 16f628a
#include <p16f628a.inc>

__CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

#define	sd	PORTA,0
#define	up	PORTA,7
#define	down	PORTA,6

CBLOCK 20h
Reg_1	:1
Reg_2	:1
Reg_3	:1
ENDC

ORG	0
goto	start


;ИНИЦИАЛИЗАЦИЯ МК
start:
clrf	INTCON
banksel	PIE1
clrf    PIE1
banksel PORTA
;BCF	INTCON,GIE	;глобальное запрещение прерываний
;BCF	INTCON,PEIE	;запретить прерывания от периферийных модулей
CLRF	PORTA		;инициализация портов
clrf	PORTB

MOVLW	b'00000101'	; 2 аналоговых входа
MOVWF	CMCON		; только 2 компаратор
BSF	STATUS,RP0
bsf	TRISA,1	;вход -
bsf	TRISA,6	;вход down
bsf	TRISA,7	;вход up
bcf	TRISA,0	;выход оптрон
movlw	0x00
movwf	TRISB

MOVLW	b'11100000'	; включитьVREF, RA2, нижн.диап., 
MOVWF	VRCON		; 0В (0В)
BCF	STATUS,RP0	; Выбрать Банк0
CALL	delay_10mks	; задержка 10 мкс

MOVF	CMCON,F	;Чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;Сбросить флаг прерываний



;ОСНОВНОЙ РАБОЧИЙ ЦИКЛ
knopka_up:		;метка работы с кнопкой UP
call	sd_os
btfss	up		;проверка факта нажатия UP
goto	wait_up
goto	knopka_down

wait_up:			;проверка факта отжатия UP
call	sd_os
btfss	up
goto	wait_up
goto	inc_vrcon

inc_vrcon:			;повышение Vref
bsf	STATUS,RP0

btfss	VRCON,0		;проверка потолка Vref=1111
goto	inc_vrcon_in
btfss	VRCON,1
goto	inc_vrcon_in
btfss	VRCON,2
goto	inc_vrcon_in
btfss	VRCON,3
goto	inc_vrcon_in
goto	inc_vrcon_out

inc_vrcon_in:		;повысить Vref (потолок не достигнут)
INCF	VRCON,1
BCF	STATUS,RP0
CALL	delay_10mks
goto	knopka_down

inc_vrcon_out:		;не повышать Vref (потолок достигнут)
bcf	STATUS,RP0
goto	knopka_down


knopka_down:		;метка работы с кнопкой DOWN
call	sd_os
btfss	down		;проверка факта нажатия DOWN
goto	wait_down
goto	knopka_up

wait_down:			;проверка факта отжатия DOWN
call	sd_os
btfss	down
goto	wait_down
goto	dec_vrcon

dec_vrcon:			;понизить Vref (плинтус не достигнут)
bsf	STATUS,RP0

btfsc	VRCON,0		;проверка плинтуса Vref=0000
goto	dec_vrcon_in
btfsc	VRCON,1
goto	dec_vrcon_in
btfsc	VRCON,2
goto	dec_vrcon_in
btfsc	VRCON,3
goto	dec_vrcon_in
goto	dec_vrcon_out

dec_vrcon_in:		;понизить Vref (плинтус не достигнут)
DECF	VRCON,1
BCF	STATUS,RP0
CALL	delay_10mks
goto	knopka_up

dec_vrcon_out:		;не понижать Vref (плинтус достигнут)
bcf	STATUS,RP0
goto	knopka_up





;подпрограмма ОС
sd_os:			;проверка компаратора 2
btfsc	CMCON,7
goto	sd_0
goto	sd_1
sd_0:			;нет накачки
bcf	sd
goto	sd_end
sd_1:			;есть накачка
bsf	sd
goto	sd_end
sd_end:
MOVF	CMCON,F	;Чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;Сбросить флаг прерываний
return





;подпрограммы задержек
delay_10mks:
movlw	.3
movwf	Reg_1
decfsz	Reg_1,F
goto	$-1
return

END

 

Пока буду проверять:

1. качество питания МК;

2. опять вариант с непосредственным подключением выхода компаратора к пину.

 

Схема

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

5c781de7aaad5_.thumb.JPG.8b1532c196ccfc4cc14f6f1eb839ec0a.JPG

 

Edited by Пентагрид

Share this post


Link to post
Share on other sites

Применил все рекомендации, скомпилировал и испробовал с десяток разных вариантов, в т.ч. с прямым подключением выхода компаратора. Наблюдения:

1. без нагрузки стабильно держит весь диапазон;

2. под нагрузкой 30 Ом напряжение держит с 9 В;

3. под нагрузкой 240 Ом держит весь диапазон подрагивая, стабильно держит с 10-11 В.

 

Решил, что при малых напряжения сказываются факторы:

1. качество питания ИОН (однако запитал от кроны через 7805, и всё осталось как прежде);

2. пульсации измеряемого напряжения (их влияние прослеживается при изменении нагрузки).

Share this post


Link to post
Share on other sites

Удалось постепенно снизить порог стабильной работы до 6 В (электролит. 22 мкФ параллельно R4, керам. 100 нФ между верхним концом R3 и точкой ИОН RA2, напряжение ОС берётся не с диода, а с нагрузки).

Share this post


Link to post
Share on other sites
Posted (edited)

@РадиоНастройщик , делитель рассчитал из того, чтобы нижний диапазон Vref=0...3,13 укладывался в 0...15 В. Стабилитрон пока убрал.

Испытания провожу при прямом выходе CMOUT2=RA4T0CKI, код к нему -- просто инициализация + циклы чтения кнопок +/- 1 В.

Укажите на сомнительные моменты, буду внимателен и попытаюсь перекроить.

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

;4 MHz внутренний
;RA7-up, RA6-down
;компаратор 1	-RA0, outRA3 (не используется, вход на землю)
;компаратор 2	-RA1, outRA4 (используется, СД к Vdd)
 +RA2 ничего не подключать!



list	p = 16f628a
#include <p16f628a.inc>

__CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT 

#define	up	PORTA,7
#define	down	PORTA,6

CBLOCK 20h
Reg_1	:1
Reg_2	:1
Reg_3	:1
ENDC

ORG	0
goto	start


;ИНИЦИАЛИЗАЦИЯ МК
start:
clrf	INTCON
banksel	PIE1
clrf	PIE1
banksel	PORTA
;BCF	INTCON,GIE	;глобальное запрещение прерываний
;BCF	INTCON,PEIE	;запретить прерывания от периферийных модулей
CLRF	PORTA		;инициализация портов
clrf	PORTB

MOVLW	b'00000110'	; оба компаратора, прямые выходе C1-RA3, C2-RA4
MOVWF	CMCON		; только 2 компаратор
BSF	STATUS,RP0
bsf	TRISA,0
bsf	TRISA,1
bcf	TRISA,3
bcf	TRISA,4
bsf	TRISA,2
bsf	TRISA,6
bsf	TRISA,7


MOVLW	b'11100000'	; включитьVREF, RA2, нижн.диап., 
MOVWF	VRCON		; 0В (0В)
BCF	STATUS,RP0	; Выбрать Банк0
CALL	delay_10mks	; задержка 10 мкс

MOVF	CMCON,F	;Чтение CMCON для устранения несоответствия
BCF	PIR1,CMIF	;Сбросить флаг прерываний



;ОСНОВНОЙ РАБОЧИЙ ЦИКЛ
knopka_up:		;метка работы с кнопкой UP
;call	sd_os
btfss	up		;проверка факта нажатия UP
goto	wait_up
goto	knopka_down

wait_up:			;проверка факта отжатия UP
;call	sd_os
btfss	up
goto	wait_up
goto	inc_vrcon

inc_vrcon:			;повышение Vref
bsf	STATUS,RP0

btfss	VRCON,0		;проверка потолка Vref=1111
goto	inc_vrcon_in
btfss	VRCON,1
goto	inc_vrcon_in
btfss	VRCON,2
goto	inc_vrcon_in
btfss	VRCON,3
goto	inc_vrcon_in
goto	inc_vrcon_out

inc_vrcon_in:		;повысить Vref (потолок не достигнут)
INCF	VRCON,1
BCF	STATUS,RP0
CALL	delay_10mks
goto	knopka_down

inc_vrcon_out:		;не повышать Vref (потолок достигнут)
bcf	STATUS,RP0
goto	knopka_down


knopka_down:		;метка работы с кнопкой DOWN
;call	sd_os
btfss	down		;проверка факта нажатия DOWN
goto	wait_down
goto	knopka_up

wait_down:			;проверка факта отжатия DOWN
;call	sd_os
btfss	down
goto	wait_down
goto	dec_vrcon

dec_vrcon:			;понизить Vref (плинтус не достигнут)
bsf	STATUS,RP0

btfsc	VRCON,0		;проверка плинтуса Vref=0000
goto	dec_vrcon_in
btfsc	VRCON,1
goto	dec_vrcon_in
btfsc	VRCON,2
goto	dec_vrcon_in
btfsc	VRCON,3
goto	dec_vrcon_in
goto	dec_vrcon_out

dec_vrcon_in:		;понизить Vref (плинтус не достигнут)
DECF	VRCON,1
BCF	STATUS,RP0
CALL	delay_10mks
goto	knopka_up

dec_vrcon_out:		;не понижать Vref (плинтус достигнут)
bcf	STATUS,RP0
goto	knopka_up





;подпрограмма ОС
;sd_os:			;проверка компаратора 2
;btfsc	CMCON,7
;goto	sd_0
;goto	sd_1
;sd_0:			;нет накачки
;bcf	sd
;goto	sd_end
;sd_1:			;есть накачка
;bsf	sd
;goto	sd_end
;sd_end:
;MOVF	CMCON,F	;Чтение CMCON для устранения несоответствия
;BCF	PIR1,CMIF	;Сбросить флаг прерываний
;return





;подпрограммы задержек
delay_10mks:
movlw	.3
movwf	Reg_1
decfsz	Reg_1,F
goto	$-1
return

END

 

 

Edited by Пентагрид

Share this post


Link to post
Share on other sites
7 минут назад, РадиоНастройщик сказал:

он просто не успевает зажигаться

Как это решить при прямом подключении компаратора? Оригинальные схемы на TL431 обеспечивают гарантированное зажигание?

Share this post


Link to post
Share on other sites

@РадиоНастройщик , всё дело оказалось в самопитании ШИМки, она берётся с того же трансформатора (обмотка Vtx). На малом коэффициенте заполнения напряжения Vcc не хватает, и ШИМка переходит в режим постоянного перезапуска, отчего и скачет вых. напряжение хаотически.

Проверил с временным питанием от "дежурки" (тлф. зарядки с домотанной вторичкой на 13 В, от которой питается МК через 7805). На её трансформатор  намотаю ещё обмотку тонким проводом и будет изолированное питание для ШИМки.

scrn1.png.dfb787ef1b00491f37a132b1e1070b6f.png

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...

  • Similar Content

    • By Retriburatin
      Здравствуйте, в вопросах электроники я новичок. Хотел бы получить совет опытных людей. Имеется данный двухполярный блок питания необходимый для работы аудио усилителя. Хотелось бы с данного БП запитать параллельно сумматор на ОУ. Для него необходимо более низкое напряжение, но так же двухполярное. Можно ли тут использовать делитель напряжения для данной цели?
    • By maniachka12
      Добрый день, нужна помощь. по поводу выключенного стабилизатора напряжения. 
      Дурацкий вопрос наверно, но в интернете ничего не нашла. Не у кого спросить. У родителей стоит котел, подключенный через стабилизатор напряжения. Так вот, мама его постоянно отключает( стабилизатор) и утверждает, что, если он выключен кнопочкой, то последовательное соединение прервано и с котлом ничего не случится. Котел, через стабилизатор остается подключенным в сеть. И скачков много, когда он включен, то переодически кликает много. Я переживаю, что котел сгорит, так ли это?
    • By john2103
      Доброго времени суток, товарищи, пытаюсь создать функции передачи по spi с использованием cmsis и прерываний. Раньше пользовался HAL на "полу- интуитивном" уровне. Все работало. Сейчас пытаюсь все писать только на cmsis и вот возникла проблема... Я попытался сделать две функции ( Отправка по SPI - 8-битного  массива и передача 8 битная DFF = 0 и отправка 16 битного массива и передача 16 бит DFF =1 и все это через прерывания)Результат смотрю анализатором и вот в чем проблема... если сначала идет функция передачи 8 битная а потом 16 битная то мелькает лишняя передача, 8 бит 0x00 и потом идет правильная передача, 16 битная. Не могу понять откуда берется эта передача??? (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF) ,  если поставить передачи 8 бит 16 бит 8 бит 16 бит то получается вот это (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF 0xAA 0xBB 0xCC 0xFE 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF), если между функциями вставить задержку 1 мс то все ок иначе тот результат о котором писал ..."головной убор Михаила Боярского"
      void SPI1_STM32F1_init(void) { // --- Инициализация порта для работы spi --- // ------ Настраиваем порт А -------------------------------------------------------------------------- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //--- Включаем тактирование порта А RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //--- Включаем тактирование альтернативных функции RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //--- Включаем тактированние SPI1 // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_CNF7|GPIO_CRL_MODE5|GPIO_CRL_MODE7); //--- Обнуление первоначальных параметров порта GPIOA->CRL |= ( GPIO_CRL_MODE5 // --- |Настройка вывода SCL, на работу в режиме альтернативной функции |GPIO_CRL_CNF5_1 // --- |режим output mode 11b - max 50 Мгц, CNF = 10b Альтернативная функция output push-pull ) |GPIO_CRL_MODE7 // --- |Настройка вывода MOSI |GPIO_CRL_CNF7_1 // --- | ); // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF6|GPIO_CRL_CNF6); GPIOA->CRL |= GPIO_CRL_MODE6; SPI1->CR1 |= SPI_CR1_BIDIMODE; // --- BIDIMODE режим работы (1 - одна линия, 0 - две линии связи) SPI1->CR1 |= SPI_CR1_BIDIOE; // --- BIDIOE Этот бит в сочетании с битом BIDImode выбирает направление передачи в двунаправленном режиме // --- 0: Output disabled (receive-only mode) // --- 1: Output enabled (transmit-only mode) SPI1->CR1 &=~SPI_CR1_CRCEN; // --- Аппаратный расчет CRC включить // --- 0: расчет CRC отключен // --- 1: Расчет CRC включен SPI1->CR1 &= ~SPI_CR1_CRCNEXT; // --- Следующая передача данных будет завершаться CRC-кодом. // --- 0: Этап передачи данных // --- 1: Следующая передача завершится передачей RCR SPI1->CR1 &= ~SPI_CR1_DFF; // --- Формат кадра данных // --- 0: Размер кадра передачи 8 бит // --- 1: Размер кадра передачи 16 бит SPI1->CR1 &= ~SPI_CR1_RXONLY; // --- Этот бит совместно с BIDIMODE выбирает направление передачи в 2-х проводном (MISO и MISO) режиме. // --- 0: Full duplex — передача и прием // --- 1: Output disabled — только прием SPI1->CR1 |= SPI_CR1_SSM; // --- Программное управление ведомым устройством. Когда бит SSM установлен, сигнал NSS заменяется значением бита SSI. // --- 0: Программное управление ведомым отключено // --- 1: Программное управление ведомым включено SPI1->CR1 |= SPI_CR1_SSI; // --- Внутренний выбор ведомого. Этот бит работает только когда бит SSM установлен. Значение этого бита принудительно подается на NSS, а значение IO вывода NSS игнорируется. // --- 1: (Master) Заменяет значение на выводе NSS // --- 0; (Slave) SPI1->CR1 &= ~SPI_CR1_LSBFIRST;// --- Формат кадра // --- 0: MSB передается первым // --- 1: LSB передается первым SPI1->CR1 |= SPI_CR1_BR; // --- BR[2:0]: Выбор скорости передачи // 000: fPCLK/2 // 001: fPCLK/4 // 010: fPCLK/8 // 011: fPCLK/16 // 100: fPCLK/32 // 101: fPCLK/64 // 110: fPCLK/128 // 111: fPCLK/256 //#define SPI_CR1_BR_Pos (3U) //#define SPI_CR1_BR_Msk (0x7U << SPI_CR1_BR_Pos) /*!< 0x00000038 */ //#define SPI_CR1_BR SPI_CR1_BR_Msk /*!< BR[2:0] bits (Baud Rate Control) */ //#define SPI_CR1_BR_0 (0x1U << SPI_CR1_BR_Pos) /*!< 0x00000008 */ //#define SPI_CR1_BR_1 (0x2U << SPI_CR1_BR_Pos) /*!< 0x00000010 */ //#define SPI_CR1_BR_2 (0x4U << SPI_CR1_BR_Pos) /*!< 0x00000020 */ SPI1->CR1 |= SPI_CR1_MSTR; // --- Выбор режима работы SPI: Master/Slave // --- 0: Режим Slave (ведомый) // --- 1: Режим Master (ведущий) SPI1->CR1 &= ~SPI_CR1_CPOL; // --- Полярность тактового сигнала // --- 0: CK в 0 при простое // --- 1: CK в 1 при простое SPI1->CR1 &= ~SPI_CR1_CPHA; // --- Фаза тактового сигнала // --- 0: Первый переход тактового сигнала является краем захвата данных // --- 1: Второй переход тактового сигнала является краем захвата данных SPI1->CR2 &= ~SPI_CR2_TXEIE; // --- Прерывание опустошения буфера передачи данных Tx // --- 0: Прерывание TXE запрещено // --- 1: Прерывание TXE разрешено. Используется для генерации прерывания когда устанавливается флаг TXE SPI1->CR2 &= ~SPI_CR2_RXNEIE; // --- Прерывание не пустого буфера приема Rx // --- 0: Прерывание RXNE запрещено // --- 1: Прерывание RXNE разрешено. Используется для генерации прерывания когда устанавливается флаг RXNE. SPI1->CR2 &= ~SPI_CR2_ERRIE; // --- Прерывание при возникновении ошибок передачи. Этот бит контролирует генерацию прерывания при возникновении одной из ошибок интерфейса SPI (CRCERR, OVR, MODF). // --- 0: Прерывание при возникновении ошибок запрещено // --- 1: Прерывание при возникновении ошибок разрешено SPI1->CR2 |= SPI_CR2_SSOE; // --- Разрешить выход SS // --- 0: Выход SS отключен в режиме master (ведущий) и есть возможность работать в multimaster режиме // --- 1: Выход SS включен в режиме master (ведущий), при этом нет возможности работать в multimaster режиме SPI1->CR2 &= ~SPI_CR2_TXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага TXE // --- 0: Tx buffer DMA disabled // --- 1: Tx buffer DMA enabled SPI1->CR2 &= ~SPI_CR2_RXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага RXNE // --- 0: Rx buffer DMA disabled // --- 1: Rx buffer DMA enabled SPI1_Enable; NVIC_EnableIRQ(SPI1_IRQn); } void SPI1_STM32F1_write_8bit_irq(uint8_t *data, int32_t len_8bit) { if(len_8bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY)) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 &= ~SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_8_bit = 0; tx_len_8_bit = len_8bit; tx_data_8_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_STM32F1_write_16bit_irq(uint16_t *data, int32_t len_16bit) { if(len_16bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 |= SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_16_bit = 0; tx_len_16_bit = len_16bit; tx_data_16_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_IRQHandler(void) { if ((SPI1->CR1&SPI_CR1_DFF) == 0) { SPI1->DR = tx_data_8_bit[tx_index_8_bit]; //Записываем новое значение в DR tx_index_8_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_8_bit >= tx_len_8_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } else { SPI1->DR = tx_data_16_bit[tx_index_16_bit]; //Записываем новое значение в DR tx_index_16_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_16_bit >= tx_len_16_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } } ............. uint8_t data_8bit[3] = { 0xAA, 0xBB, 0xCC}; uint16_t data_16bit[3] = { 0xDDDD, 0xEEEE, 0xFFFF}; int main(void) { SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); }  
    • By Михаил N
      Собрал трёхфазный H-мост мост на драйверах ир2110 и транзисторах irf540, схема прям даташит, драйверы запитаны от lm7815, ток потребления 40 мА, к входам драйверов подключены оптопары, оптопарами и управляет контроллер атмега88, частота 450 гц, мертвое время задано строчкой OCRnA=OCRnB-5, резисторы на затворах 18 Ом. Проблема такая, когда транзисторы не подключены к источнику питания, все работает как надо, стоит подключить транзюкам они без нагрузки на выходе начинают кушать 0.2 А, напряжение на затворах транзисторов подпрыгивает с 15 до 20 вольт, напряжение на драйверах и на стабилизаторе соответственно тоже и lmка выходит из строя в течении полминуты. Ставил после стабилизатора диод, эффект тот же. Транзисторы и драйверы холодные, при токе в 5 ампер по постоянке даже не потеплели. Подскажите куда копать?


      Забыл добавить характеристики питания, батареи 36 вольт напрямую к транзисторам, логика и управление через лм78хх от ИИП 20 вольт. ИИП запитан от этих же батарей, так что минусовая шина общая, по выходу с блока ДГР и конденсаторы с малым ерс +керамика и ферритовое колечко дополнительно, осциллографом помех от блока не видно.
    • By Sanya757
      Всем здравствуйте.     Не понимаю, почему в описании работы схемы противоречит законам электроники? ... или может я каких то процессов не до понимаю....       
       Если по какой то причине напряжение на выходе стабилизатора стало меньше номинального... То как тогда уменьшение падения напряжения на резисторе Rk (см. текст), может увеличить напряжение Uб-1 и Uбэ-1 транзистора T1, если уменьшение напряжения  должно наоборот уменьшить напряжение на этом транзисторе ?.


       
       
  • Сообщения

    • Мне очень запала эта схемка,кто бы ее правильно на кварц.стабилизацию качнул!?Хотя жалоб о стабильности от меня.Просто хотелось бы увести его из этого диапазона.  представляю мощного жука #1²  и #1³ Т1 КТ3130Б; Т2 Bfr93; Т3 Bfr93. Т1 КТ3107Л; Т2 КТ368; КТ913Б.     Для антенн буду использовать посеребренный провод. .ля,как же я доволен вашей схемкой!
    • Вопрос следовало задать в теме защиты акустики, так так собственно к усилителю она имеет опосредованное отношение. По вопросу, я делаю так       
    • Здарова друзья!Ну что пробовал я собирать как и обещал,эту схему!Так как на схемке. Работает жучек,но мощность сильно падает,до 150метров,катушку на выходе делал так :L3 3+3витка(2катушки)спаивал в одну катушку,получался центральный выход на коллектор s9018,и катушечка L4 на 2виточка, от которой идет уже конкретно антенна,своими двумя витками помещалась посредине L3,3миллиметровый латунный сердечник плотно проходил внутри,и это не добавляло особо мощности,только взлетала частота до 145мГц что немножко упрощало его поиск и все. Потому я от этого каскада отказался.Просто перед антенной поставил конденсатор от 10--22pf!
    • То есть цифровой вольтметр определяет направление тока и по этому принципу ставит знак? И высчитывает разность потенциалов этого минуса?
    • Еще раз напишу, что стрелочки указывают направление тока. Если батарейку (любую) перевернуть, тока не будет, светодиод светится не будет. Ионы не перейдут через запрещённую зону PN-перехода диода  при "не той" полярности. Считай, что в мультиметре знак "минус" подсвечивает тот светодиод, который правый. Переворачиваешь правую батарейку, и мультиметр твой покажет напряжение без знака "минус".
    • @Slavka Всё именно так, как вы сказали. Но и с vg155 согласен, что вызванивать каждый контакт без конкретной схемы, а только аналогов. Нет гарантий что найду все контакты или не допущу ошибки. По этому и посмотрел барахолку и нашёл экземпляр с более простой проблемой. А так вот мой парк (маленьких DT182 даже 2шт)  
    • Прошу объясните. Вот если чёрный щуп мультиметра ставлю между двумя батарейками, а красный ставлю на плюс или минус, то почему мультиметр показывает знак минус в случае если ставлю на минус красный щуп? Как мультиметр определяет где минус, где плюс?
  • Покупай!

×
×
  • Create New...