📄 pwm_v1.asm
字号:
首先按照下面的公式建立一个正弦波样本表,样本表将一个正弦波周期分为50个点,每点按7位量化(124对应最高幅值Vcc/2):
f(x) = 64 + 60 * sin(2πx/50) x∈[0…49]
// 100点正弦波样本表
const unsigned char auc_SinParam[50] = {
64,72,79,86,93,
99,105,110,115,118,
121,123,124,124,123,
121,118,115,110,105,
99,93,86,79,72,
64,56,49,42,35,
29,23,18,13,10,
7,5,4,4,5,
7,10,13,18,23,
29,35,42,49,56,
};
#include <p16f876A.inc>
SINTABLE_PNT EQU 2F
SINTABLE EQU 30
;************************************
org 00h
goto START
org 04h
goto INT_SER
org 20h
START:
BSF STATUS,RP0 ;BANK1
MOVLW 0xFF
MOVWF TRISA
MOVLW 0xC0
MOVWF TRISB
MOVLW 0x80
MOVWF TRISC
BCF STATUS,RP0 ;BANK0
CLRF PORTA
CLRF PORTB
MOVLW 0xC1
MOVWF PORTC
CLRF CCP1CON ;CCP Module is off
CLRF TMR2 ;Clear Timer2
MOVLW 0x01 ;00000001
MOVWF T2CON
BSF STATUS,RP0 ;BANK1
MOVLW 0xF9 ;Fpwm = 50HZ x 50 = 2500HZ , Postscaler = 1:1 , Prescaler = 1:4
MOVWF PR2
BCF STATUS,RP0 ;BANK0
MOVLW SINTABLE
MOVWF FSR
MOVF INDF,0
MOVWF CCPR1L
CLRF PIR1 ;Clear peripheral interrupts Flags
MOVLW 0x0C ;00001100 PWM mode, 2 LSbs of Duty cycle = 00
MOVWF CCP1CON
BSF STATUS,RP0 ;Bank1
BSF PIE1,TMR2IE ;Enable peripheral interrupts
BSF INTCON,PEIE
BSF INTCON,GIE
BCF STATUS,RP0 ;BANK0
BSF T2CON,TMR2ON ;Timer2 starts to increment
INT_SER:
BCF STATUS,RP0 ;BANK0
BTFSC PIR1,TMR2IF
GOTO TMR2_INT_SER
NOP
NOP
GOTO INT_SER_END
TMR2_INT_SER:
BCF PIR1, TMR2IF
INCF SINTABLE_PNT,1
MOVF SINTABLE_PNT,0
MOVWF FSR
MOVF INDF,0
MOVWF CCPR1L
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -