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á.
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
;******************************************************************* 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