Pulzně šířková modulace - PWM

Pulzně šířková modulace (Pulse Width Modulation) je signál s konstantní periodou , kde se mění poměr délky impulzu ku délce mezery jedné periodě. Střída se někdy uvádí jako poměr např. 1:1,2:1,1:5 atd., kdy je nutné uvést které číslo představuje impulz a které mezeru. Střída se také vyjadřuje procentuálně např. 100%,50%,0.1% atd., kde 100% představuje ideální poměr 1:0, 50% poměr 1:1 atd. Pulzně šířková modulace se využívá ve spínaných napájecích zdrojích, v konvenčním řízení otáček stejnosměrných motorů, stejně tak i ve frekvenčních měničích pro řízení střídavých asynchronních motorů. Energetická úspora oproti řízení otáček změnou velikosti např. napětí může být u velkých motorů značná.

Princip generování signálu s PWM modulací

Při generování signálu s modulaci PWM můžeme použít dvou čekacích smyček takové délky, aby obě dohromady daly dobu periody PWM signálu. Znamená to, že pokud se doba jedné smyčky prodlužuje, musí se doba druhé smyčky zkracovat. Výstupní signál je potom po dobu jedné smyčky aktivní a po druhé neaktivní.

	MOVLW	B'00001111'	;naplneni registru W
	MOVWF	portb		;presun do portu B
	MOVF	temp1,w		;naplneni registru W z registru temp1
	CALL	cekat		;skok do cekaci smycky, delky smycky v registru W
	COMF	portb,f		;negace hodnoty brany B
	COMF	temp1,w		;naplneni registru W negovanou hodnotou registru temp1
	CALL	cekat		;skok do cekaci smycky, delky smycky v registru W


Ukázkový program generování signálu s PWM modulací

Zdrojový kód v asm
Soubor HEX pro programátor
Projekt do programu MPLAB

;*******************************************************************
w	equ	0		;parametr instrukci
f	equ	1		;parametr instrukci
z	equ	2		;bit registru SWR
f0	equ	0x00		;registr neprimeho adresovani
swr	equ	0x03		;adresa SWR registru
fsr	equ	0x04		;registr adresy neprimeho adresovani
porta	equ	0x05		;adresa brany A
trisa	equ	0x85		;adresa registru TRISA
portb	equ	0x06		;adresa brany B
trisb	equ	0x86		;adresa registru TRISB
cnt1	equ	0x0C		;definice registru cnt1
cnt2	equ	0x0D		;definice registru cnt2
temp1	equ	0x0E		;definice registru temp1

;*******************************************************************
#define up	portb,0		;tlacitko nahoru
#define down	portb,1		;tlacitko dolu
#define bit_z	swr,2		;priznak nuloveho vysledku
;*******************************************************************
	list 	p = 16F84	
	__config 0x3FF1		;nastaveni konfigurace
;*******************************************************************
	org	0x0000		;adresa zacatku programu
	GOTO	main		;skoci na zacatek hlavniho programu
;*******************************************************************
;cekaci smycka

cekat	MOVWF	cnt1		;naplneni registru
	MOVF	cnt1,f		;nastaveni priznaku z
	BTFSC	bit_z		;je bit z = 0 , registr cnt1 = 0 ?
	RETURN			;ano , navrat z cekaci smycky
				;ne , pokracovat v cekaci smycce

cekej_2	MOVLW	d'5'		;naplneni registru W
	MOVWF	cnt2		;presun W do cnt2
cekej_1	DECFSZ	cnt2,f		;odecte od registru 1.smycky 1
	GOTO	cekej_1		;skoci, je-li registr roven 0
	DECFSZ	cnt1,f		;odecte od registru 2.smyčky 1
	GOTO	cekej_2		;skoci, je-li registr roven 0
	
	RETURN			;navrat z cekaci smycky

;*******************************************************************
;prepnuti portu na cteni tlacitek

cteni	MOVLW	trisa		;naplneni registru W
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	MOVWF	f0		;presun do registru neprimeho adresovani
	MOVLW	trisb		;naplneni registru W
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	MOVWF	f0		;presun do registru neprimeho adresovani

	RETURN			;navrat

;*******************************************************************
;prepnuti portu na vystup, aktivni rada LED
	
zapis	MOVLW	trisa		;naplneni registru W				
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'11111011'	;naplneni registru W - rada LED jako vystup
	MOVWF	f0		;presun do registru neprimeho adresovani
	MOVLW	B'11111011'	;naplneni registru - aktivni rada LED
	MOVWF	porta		;presun do portu A
	MOVLW	trisb		;naplneni registru W
	MOVWF	fsr		;presun do registru FSR - neprima adresa
	MOVLW	B'00000000'	;port b jako vystupy
	MOVWF	f0		;presun do registru neprimeho adresovani

	RETURN			;navrat

;*******************************************************************
;hlavni program

main	MOVLW	D'128'		;naplneni registru W
	MOVWF	temp1		;presun do registru temp1

	
smycka	CALL	cteni		;prepnuti na cteni tlacitek

test_1	BTFSC	up		;cteni tlacitka 1	
	GOTO	test_2		;tlacitko nebylo stisknuto
	DECFSZ	temp1,f		;registr temp1 - 1, test je-li vysledek 0
	GOTO	zobraz		;temp1 < 0 , skok na zobrazeni
	MOVLW	D'1'		;temp1 = 0 --->  temp1 = 1 , naplneni registru W 
	MOVWF	temp1		;presun do registru temp1


test_2	BTFSC	down		;cteni tlacitka 2
	GOTO	zobraz		;tlacitko nebylo stisknuto
	INCFSZ	temp1,f		;registr temp1 + 1, test je-li vysledek 0
	GOTO	zobraz		;temp1 < 0 , skok na zobrazeni
	MOVLW	D'255'		;temp1 > 255 --->temp1 = 255 , naplneni registru w
	MOVWF	temp1		;presun do registru temp1

	

zobraz	CALL	zapis		;prepnuti na vystupy, aktivni rada LED
	MOVLW	B'00001111'	;naplneni registru W
	MOVWF	portb		;presun do portu B
	MOVF	temp1,w		;naplneni registru W z registru temp1
	CALL	cekat		;skok do cekaci smycky, delky smycky v registru W
	COMF	portb,f		;negace hodnoty brany B
	COMF	temp1,w		;naplneni registru W negovanou hodnotou registru temp1
	CALL	cekat		;skok do cekaci smycky, delky smycky v registru W

	GOTO	smycka		;skok zpet na zacatek smycky hlavniho programu
	end