Elektronik / Mikrodenetleyici Projeleri/

PIC16F629 ile USB Pil Şarj Devresi

USB Pil Şarj Devresi Pic16f629 mikrokontrol entegresi ile bilgisayarın usb portundan 1 adet 100-1000ma AAA pil şarj devresi şarj süresi pil akımına göre 1-14 saat arası pil dolduğu zaman çift renkli led ve buzzer ile uyarı veriliyor. Devre USB portundan besleneeği için devre şemasında ki 7805 5 volt regülatör entegresi kullanılmayacak USB portu kullanmak istemezseniz yani 9v…12v adaptör ile kullanacaksanız 7805 takılı olmalı..

usb-charger

aaa-battery-charger-usb-port-usb-charger-schema

USB Pil şarj devresinin mikrodenetleyici yazılımı assembly ile hazırlanmış kaynak .asm ve .hex dosyaları var.

; Nabijeni akumulatoru NiCd nebo NiMh

; verze 1.1 - procesor PIC12F629, vnitrni RC 4,00MHz (17.12.2006)
; Upraveno preruseni a zlepsena presnost casu
; Pipnuti pri stisku tlacitka a po skonceni nabijeni 10 x zapipa

; verze 1.0 - procesor PIC12F629, vnitrni RC 4,00MHz (28.5.2006)

; Popis:
; Po zapnuti napajeni se rozsviti zelena LED dioda. Po stisknuti tlacitka
; zhasne zelena LED dioda a zacne blikat 1x cervena LED dioda a zacne se
; nabijet proudem 100mA. Dalsi stisk blika 2x (200mA) a dalsi 3x (300mA).
; 1 blik - 100mA po dobu 14 hodin
; 2 blik - 200mA po dobu  7 hodin
; 3 blik - 300mA po dobu  5 hodin
; Po dalsim stisku prestane blikat cervena LED dioda, prestane se dobijet
; a rozsviti se zelena LED dioda. Cely cyklus se opakuje stale do kola.
; Po nabiti baterie prestane blikat cervena LED dioda a rozsviti se zelena LED dioda.

; Poznamka:
; Pred programovanim procesoru si prectete a nekam zapiste hodnotu z posledniho
; byte (03FFh) programove pameti. Je tam ulozena kalibracni hodnota vnitrniho
; oscilatoru 4MHz. Zapsat hodnotu muzete treba na spodni stranu pouzdra obvodu.

; Zatizeni procesoru: cely port 125mA, jeden vyvod 25mA.

;**************************************************************************
;*                              PIC12F629/12F675                          *
;*                             --------\/--------                         *
;*                       +5V  -|Vdd          Vss|-  0V                    *
;*            Dobijeni 200mA  -|osc1/GP5     GP0|-  Piezomenic (A/D)      *
;*            Dobijeni 100mA  -|osc2/GP4     GP1|-  LED Zelena            *
;*                  Tlacitko  -|MCLR/GP3 INT/GP2|-  LED Cervena           *
;*                             ------------------                         *
;* http://www.cmail.cz/doveda                   DOVEDA BOYS (c) 1997-2006 *
;**************************************************************************

; Rozdeleni pameti v procesoru PIC16F629 a PIC16F675

; Procesor , EPROM,   RAM, EEPROM,  A/D, RS232,   I2C, INT.OSC
; PIC16F629,  1024,    64,   128,  ----,  ----,  ----,    4MhZ
; PIC16F675,  1024,    64,   128,    4 ,  ----,  ----,    4MhZ

; Banka 0 ->  20h -              -  5Fh (64 bytes)
; Banka 1 ->  A0h - jako BANKa 0 -  DFh (64 bytes)
;**************************************************************************

list	p=12f629, R=DEC
include "p12f629.inc"

RAM		equ	20h	; prvni adresa pameti RAM pro PIC16F629 - 64bajtu (20h-5Fh)
TMP_W		equ	RAM+01	; temp preruseni
TMP_S		equ	RAM+02	; temp preruseni
TMP_PCL		equ	RAM+03	; temp preruseni

C_10ms		equ	RAM+04
C_100ms		equ	RAM+05
C_1s		equ	RAM+06
PRIZNAK		equ	RAM+07	; priznaky
PROVOZ		equ	RAM+08
POSUN		equ	RAM+10

T_SEC		equ	RAM+11
T_MIN		equ	RAM+12
T_HOD		equ	RAM+13

AL_MIN		equ	RAM+14
AL_HOD		equ	RAM+15

LOOP0		equ	RAM+16
LOOP1		equ	RAM+17
LOOP2		equ	RAM+18
LOOP3		equ	RAM+19

T_BEEP		equ	RAM+20
BEEP1		equ	RAM+22
BEEP0		equ	RAM+23
POCET		equ	RAM+24

#define	B_END	PRIZNAK,1	; 1=povolen citac nastaveneho casu
#define	B_PIP	PRIZNAK,2	; 1=povoleno pipnuti (stisk tlacitka)
#define	B_PIP8	PRIZNAK,3	; 1=povoleno pipnuti (konec dobijeni)
#define	B_PIPX	PRIZNAK,4	; 1=povolen casovac pipani
#define	B_TLAC	PRIZNAK,5	; 1=vyhodnoceno stisko v 1 cteni
#define	B_TISK	PRIZNAK,6	; 1=vyhodnocen stisk tlacitka OK

#define	Q_PIP	GPIO,0		; Piezomenic     (0=klid, 1=sepne)
#define	Q_LEDZ	GPIO,1		; LED zelena     (0=nesviti, 1=sviti)
#define	Q_LEDR	GPIO,2		; LED cervena    (0=nesviti, 1=sviti)
#define	TLAC1	GPIO,3		; Tlacitko       (0=sepnuto, 1=klid)
#define	Q_100m	GPIO,4		; Dobijeni 100mA (0=klid, 1=dobiji)
#define	Q_200m	GPIO,5		; Dobijeni 200mA (0=klid, 1=dobiji)

	org	0x2007		; adresa konfigurace pro PIC16F629 a 675
	dw _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF

	org	0x0000		; zacatek programu
	goto	INIT		; skok na pocatecni inicalizaci

	org	0x0004		; vektor preruseni
	goto	PRERUS

;**************************************************************************
;*                      preruseni kazdych 250us (4000Hz)                  *
;**************************************************************************
; ulozeni hodnot registru W a STATUS

PRERUS	movwf	TMP_W
	swapf	STATUS,W	; prohodi nibble STATUS a ulozi do W
	bcf	STATUS,RP0	; nastaveni banky 0
	movwf	TMP_S		; ulozit STATUS
;       ------------------------
	bcf	INTCON,T0IF	; vynulovat priznak preruseni (pretekl casovac TMR0)
;-------------------------------
; hodiny chodi rychle .10
; hodiny chodi pomalu .8

	movlw	.9		; nastavit timer 256 - 250 = 6 + 13 (preruseni = 250us)
	addwf	TMR0,F		; nastaveni deliciho pomeru preddelicky
;-------------------------------
	movlw   b'00000001'     ; negace bitu Q_PIP (ostatni beze zmen)
	btfsc	B_PIP		; povolit nebo zakazat menit vystup pro piezomenic
	xorwf   GPIO,F		; =1, povoleno (frekvence piskani = 2000Hz)
;-------------------------------
CAS_10m	decfsz	C_10ms,F
	goto	INT_END		; jeste neni 0
;       ------------------------  !!! kazdych 10ms !!!
	movlw	.40		; pri docitani k 0 obnovit hodnotu 
	movwf	C_10ms		; 10ms 20ms 40ms 80ms 160ms 320ms 640ms 1,28s 2,56s
;-------------------------------
; Pipnuti

	btfss	B_PIP
	goto	$+5		; =0, zakazano pipnout

	decfsz	T_BEEP,F
	goto	$+3		; jeste neni 0
;       ------------------------
	bcf	B_PIP		; zakazano (konec) pipnuti
	bcf	Q_PIP		; vypnout vystup
;-------------------------------
; Pipani

	btfss	B_PIP8
	goto	INT_200		; =0, zakazano pipani
;       ------------------------
	btfss	B_PIPX
	goto	PIP0		; =0, skoc na mezeru
;       ------------------------
	bsf	B_PIP		; povoleno pipnout
	decfsz	BEEP1,F
	goto	INT_200		; jeste neni 0

	bcf	B_PIPX
	movlw	.10		; delka mezery  10 * 10ms -> 100ms
	movwf	BEEP0

	goto	INT_200
;       ------------------------
PIP0	bcf	B_PIP		; zakazano pipnout
	decfsz	BEEP0,F
	goto	INT_200		; jeste neni 0

	bsf	B_PIPX
	movlw	.10		; delka pipnuti 10 * 10ms -> 100ms
	movwf	BEEP1
;       ------------------------
	decfsz	POCET,F
	goto	$+3		; jeste neni 0

	bcf	B_PIP8		; zakazano (konec) pipani
	bcf	Q_PIP		; vypnout vystup	
;-------------------------------
; Casovac 200ms

INT_200	decfsz	C_100ms,F
	goto	INT_1S		; jeste neni 0
;       ------------------------  !!! kazdych 200ms !!!
	movlw	.20		; pri docitani k 0 obnovit hodnotu 
	movwf	C_100ms
;-------------------------------
; blikat s LED

	btfss	B_END
	goto	INT_1S		; =0, zakazan citac

	bcf	STATUS,C	; prednastaveni bitu C
	btfsc	POSUN,0
	bsf	STATUS,C

	rrf	POSUN,F
;       ------------------------
	btfsc	STATUS,C
	bsf	Q_LEDR		; =1, LED sviti

	btfss	STATUS,C
	bcf	Q_LEDR		; =0, LED zhasnuta
;-------------------------------
INT_1S	decfsz	C_1s,F
	goto	INT_END		; jeste neni 0
;       ------------------------  !!! kazdych 1000ms !!!
	movlw	.100		; pri docitani k 0 obnovit hodnotu
	movwf	C_1s

	btfss	B_END
	goto	INT_END		; =0, zakazan citac

	call	REAL_T		; vypocet realneho casu kazdou sekundu
	call	ALARM		; porovnat nastaveny cas
;-------------------------------
; obnoveni hodnot registru W a STATUS

INT_END	swapf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
	movwf	STATUS		; obnova STATUS

	swapf	TMP_W,F		; prohodi nibble TMP_W
	swapf	TMP_W,W		; obnova W
;       ------------------------
	retfie			; navrat z preruseni
;**************************************************************************
REAL_T	incf	T_SEC,F		; pricti sekundy (00 - 59)

	movlw	.60
	subwf	T_SEC,W
	btfss	STATUS,Z
	return			; neni prenos sekund

	clrf	T_SEC
;-------------------------------
	incf	T_MIN,F		; pricti minuty (00 - 59)

	movlw	.60
	subwf	T_MIN,W
	btfss	STATUS,Z
	return			; neni prenos minut

	clrf	T_MIN
;-------------------------------
	incf	T_HOD,F		; pricti hodiny (00 - 23)

	movlw	.24
	subwf	T_HOD,W
	btfss	STATUS,Z
	return			; neni prenos hodin

	clrf	T_HOD
;-------------------------------
	return
;**************************************************************************
ALARM	movlw	.00		; porovnat sekundy
	subwf	T_SEC,W		; T_SEC - W -> W
	btfss	STATUS,Z
	return			; =0, neni 0 sekund
;-------------------------------
	movf	AL_HOD,W	; porovnat hodiny
	subwf	T_HOD,W		; T_HOD - W -> W
	btfss	STATUS,Z
	return			; =0, hodnoty se neshoduji
;       ------------------------
	movf	AL_MIN,W	; porovnat minuty
	subwf	T_MIN,W		; T_MIN - W -> W
	btfss	STATUS,Z
	return			; =0, hodnoty se neshoduji
;-------------------------------
; vyhodnocen cas alarmu

	movlw	.10		; pocet pipnuti
	movwf	POCET
	movlw	.10		; delka pipnuti 10 * 10ms -> 100ms
	movwf	BEEP1
	movlw	.10		; delka mezery  10 * 10ms -> 100ms
	movwf	BEEP0

	bsf	B_PIP8		; povoleno pipani
;       ------------------------
	bcf	B_END		; zakazan citac
	clrf	PROVOZ

	bcf	Q_LEDR		; LED zhasnuta
	bsf	Q_LEDZ		; LED sviti

	bsf	Q_100m		; vypnout proud 100mA
	bsf	Q_200m		; vypnout proud 200mA
;       ------------------------
	return
;**************************************************************************
INIT	movlw	b'110000'	; prednastavit 0 na GP0 - GP5
	movwf	GPIO

	movlw	b'00000111'	; =07h, digitalni vstupy na GP0 - GP2 (comparator OFF)
	movwf	CMCON
;       ------------------------
	bsf	STATUS,RP0	; nastaveni BANKY 1

	movlw	B'001000'
	movwf	TRISIO		; nastaveni portu GP0 (0=vystup, 1=vstup)

	movlw	b'11011000'	; PULL-UPy OFF, preddelic=1:1 pripojen k WDT
	movwf	OPTION_REG	; f=4,0MHz :4  :1  :250 = 4000Hz (250us)

	call	03FFh		; zapsat kalibraci vnitrniho oscilatoru
	movwf	OSCCAL		; 00h min. f, 80h stred f, 0FFh pro max. f
;       ------------------------
	movlw	b'00000000'	; nastaveni PULL-UP na vstupu GP0 - GP2, GP4-GP5
	movwf	WPU		; (0 zakazan, 1 povolen)
	movlw	b'00000000'	; preruseni pri zmene na vstupu GP0 - GP5
	movwf	IOCB		; Povolit INT on CHANGE na GP0 (0 zakazano, 1 povoleno)

	bcf	STATUS,RP0	; nastaveni BANKY 0
;-------------------------------
	clrf	PRIZNAK

	clrf	AL_MIN
	clrf	AL_HOD

	clrf	T_SEC
	clrf	T_MIN
	clrf	T_HOD

	clrf	PROVOZ
	clrf	POSUN

	movlw	01h
	movwf	C_10ms
	movwf	C_100ms
	movwf	C_1s

	bsf	Q_LEDZ		; LED sviti
;       ------------------------
	clrf	TMR0		; nulovat TMR0 (i jeho preddelic)

	movlw	b'10100000'	; povolit preruseni od preteceni TMR0
	movwf	INTCON
;**************************************************************************
MAIN	call	STISK		; vyhodnotit stisk tlacitka
;       ------------------------
	btfss	B_TISK
	goto	MAIN		; =0 tlacitko neni stisknuto
;-------------------------------
; tlacitko je stisknuto

	incf	PROVOZ,F
	movlw	b'00000011'
	andwf	PROVOZ,F

	bcf	B_TISK
;       ------------------------
	movlw	.0
	subwf	PROVOZ,W
	btfss	STATUS,Z
	goto	$+9

	movlw	b'00000000'	; nastav blikani
	movwf	POSUN

	bcf	B_END		; zakazan citac
	clrf	PROVOZ

	bcf	Q_LEDR		; LED zhasnuta
	bsf	Q_LEDZ		; LED sviti

	bsf	Q_100m		; vypnout proud 100mA
	bsf	Q_200m		; vypnout proud 200mA
;       ------------------------
	movlw	.1
	subwf	PROVOZ,W
	btfss	STATUS,Z
	goto	$+.10

	movlw	b'00000001'	; nastav blikani
	movwf	POSUN
	movlw	.14		; nastav HOD
	movwf	AL_HOD
	movlw	.00		; nastav MIN
	movwf	AL_MIN

	bcf	Q_100m		; zapnout proud 100mA
	bsf	Q_200m		; vypnout proud 200mA

	call	SET_AL
;       ------------------------
	movlw	.2
	subwf	PROVOZ,W
	btfss	STATUS,Z
	goto	$+.10

	movlw	b'00000101'	; nastav blikani
	movwf	POSUN
	movlw	.07		; nastav HOD
	movwf	AL_HOD
	movlw	.00		; nastav MIN
	movwf	AL_MIN

	bsf	Q_100m		; vypnout proud 100mA
	bcf	Q_200m		; zapnout proud 200mA

	call	SET_AL
;       ------------------------
	movlw	.3
	subwf	PROVOZ,W
	btfss	STATUS,Z
	goto	$+.10

	movlw	b'00010101'	; nastav blikani
	movwf	POSUN
	movlw	.05		; nastav HOD
	movwf	AL_HOD
	movlw	.00		; nastav MIN
	movwf	AL_MIN

	bcf	Q_100m		; zapnout proud 100mA
	bcf	Q_200m		; zapnout proud 200mA

	call	SET_AL
;-------------------------------
	goto	MAIN

;**************************************************************************
SET_AL	clrf	T_SEC
	clrf	T_MIN
	clrf	T_HOD
;       ------------------------
	bcf	Q_LEDR		; LED zhasnuta
	bcf	Q_LEDZ		; LED zhasnuta

	bsf	B_END		; povolen citac
;-------------------------------
	return
;**************************************************************************
; Vyhodnoceni stisku tlacitka

STISK	btfss	TLAC1
	goto	$+3		; =0, tlacitko stisknuto

	bcf	B_TLAC		; tlacitko neni stisknuto tak smaz bit stisku
	return
;-------------------------------
	btfsc	B_TLAC
	goto	$+4		; =1, stisk byl vyhodnocen v prvnim cteni

	bsf	B_TLAC		; vyhodnocen prvni stisk

	movlw	.10		; 4ms * 10 = 40ms
	movwf	LOOP3
;       ------------------------
STISK1	call	CEK4m		; cekej 4ms

	btfsc	TLAC1
	goto	STISK		; =1, tlacitko neni stisknuto
;       ------------------------
	decf	LOOP3,F

	movf	LOOP3,W
	btfss	STATUS,Z
	goto	STISK1		; jeste neni konec vyhodnoceni casu tlacitka
;       ------------------------
	bsf	B_TISK		; vyhodnoceno stisknute tlacitko
;-------------------------------
; Pipnout

	movlw	.10		; delka pipnuti 10ms * 10 -> 100ms
	movwf	T_BEEP

	bcf	B_PIP8		; zakazano (konec) pipani
	bsf	B_PIP		; povoleno pipnuti
;-------------------------------
	return
;**************************************************************************
CEK100m	movlw	0CFh		; cas = 100,009 ms
	movwf	LOOP0
	movlw	0A0h
	movwf	LOOP1
	goto	SMYCKA
;-------------------------------
CEK4m	movlw	0A5h		; cas = 4,001 ms
	movwf	LOOP0
	movlw	008h
	movwf	LOOP1
	goto	SMYCKA
;-------------------------------
SMYCKA	movf	LOOP0,W
	movwf	LOOP2
SMYCKA1	decfsz	LOOP2,F		; mala smycka
	goto	SMYCKA1

	decfsz	LOOP1,F		; velka smycka
	goto	SMYCKA
	return
;**************************************************************************

	end			; konec programu

Kaynak site kapanmış açıklamaların google translate ile çevirisini ekliyorum;

USB bağlantı noktası ile AAA pil şarj cihazı

Şarj akımı 3 seçenekler arasından seçim yapabilirsiniz . Sayısı düğmesi kırmızı LED yanıp sönmeye başlar ve şarj akımı ve zaman ayarlar edilir . Şarj edildikten sonra ,yeşil LED ve sesli alarm başlar .

Set programa göre şarj şarj pil . Şarj süresi sınırlıdır vebelirlenen süre sonra şarj gerilimi aküden ayırır . Güncel saati ayarlama ve bu seçti . 1 darbe 14 saat boyunca 100 mA olan , iki yanıp 7 saat 200mA ve 3 yanıp 5 saat boyunca 300 mA . Biz hesappil 900 mA veya 1000 mA içine almak ve nominal akımının 0,1 C yani onda biri şarj tavsiye , biz de 14 saat boyunca 100 mA akım şarj edin. Süresi çok uzun , belirli bir durumda olduğu için , bu şarj süresini kısaltan ve 200 mA , 300 mAakım artırmak mümkündür . Ben şarj ısıtılır ve pil şarjpilin sıcaklığı denetlemediği için daha güncel kullanmanızı tavsiye etmiyoruz . Bu pil aşırı ısınmaya ve sonraki imha neden olabilir . Şarj pil sıcaklığı kontrol etmek ve yüksek ısıtma gücü ile azaltmak ya da şarj durdurmak için uygun eller zaman !

Önemli uyarı : USB aygıtları kadar 100 mA PC’den çekebilir . Akım aralığı yapılandırma tanımlayıcı istenen sadece alınan ve Enerji işletim sistemi onaylar olabilir . Bu şarj değil ve bu nedenle her PC çalışmayabilir. Bu nedenle , akılda da olabilir ( ve olmalıdır ) bir kısa devre olarak tanımlanan ve USB bağlantı noktası kesin olarak uzun süre ve mantarlar için büyük bir akım çekecek C1 kapasitörü , personel .

Işlemin açıklaması: PC’nin USB portuna adaptörü bağladıktan sonra yeşil yanar. Buşarj enerji ve şarj etmek için hazır olduğunu gösterir . Düğmesine basarak yeşil ve her 1.6 saniyede bir yanıp sönerLED 1 kırmızı ışık gider sonra . Basıldığında 2 kez yanıp ve bastıktan sonra 3 kez yanıp söner olacaktır . Yanıp sönen kırmızı ve yeşil ışıklar söner durdurma basılması ve şarj cihazı şarj çalışmaya hazırdır . Düğmeye her bastığınızda , bir bip sesi duymak ve bip bip 10 kez şarj ettikten sonra olacaktır .

USB Charger

Charger recharges the battery according to the set program. Charging time is limited and after the set time disconnects the battery from the charging voltage . Setting the current time and I chose this. 1 pulse is 100 mA for 14 hours , two flashes is 200mA for 7 hours and 3 flashes is 300 mA for 5 hours . If we take into account the battery 900 mA or 1000 mA and recommended charging 0.1 C ie one tenth of the nominal current, so we charge current of 100 mA for 14 hours. Because time is too long a particular case , it is possible to shorten the charging time and increase the current to 200 mA and 300 mA . I do not recommend using more current because the charge is heated and the battery charger does not check the temperature of the battery. This could cause excessive overheating and subsequent destruction of the battery. When charging is suitable hands to control the battery temperature and at high heating power to reduce or stop charging !

PIC16F629 ile USB Pil Şarj Devresi dosyalar Kaynak: http://www.cmail.cz/doveda/konstrukce/aku_usb/index.htm alternatif link: PIC16F629 ile USB Pil Şarj Devresi

Dosya indirme LINK listesi (TXT formatında) link-746.zip şifre-pass: 320volt.com

Yorum

Soru: