采用直流电机, 用霍尔元件 ,由单片机一输入口,计数输入转数。 单片机采用 STC 15W4K32S4
以下是 控制电机电压 PWM 程序详解
汇编示例代码1
假如要生成一个重复的PWM波形,波形如下:
PWM波形发生器的时钟频率为系统时钟/4,波形由通道4输出,周期为20个PWM时钟,占空比为1/3,由4个PWM时钟的相位延迟(波形如下图所示)
汇编代码可以如下设计:2500 ---- 4000 转
;; +-------------------------+
;; | Global Configuration
;; +-------------------------+
;; 全局配置
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Set EAXSFR to enable xSFR writing against XRAM writing
; 设置端口配置寄存器 P_SW2
; EAXSFR: 扩展xSFR访问控制使能 EAXSFR为1
端口配置寄存器P_SW2
地址:BAH 初始值:0000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
EAXSFR
0
0
0
-
S4_S
S3_S
S2_S
EAXSFR:扩展SFR访问控制使能
:MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM)
:MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR)
注意:若要访问PWM在扩展RAM区的特殊功能寄存器,必须先将EAXSFR位置为1
BIT6,BIT5,BIT4为内部测试使用,用户必须填0
mov A, P_SW2
orl A, #10000000B
mov P_SW2, A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Set channel-4 output register start at LOW
; 设置 PWM配置寄存器 PWMCFG
; 通道 4 初始化为低电平
PWM配置寄存器PWMCFG
地址:F1H 初始值:0000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
-
CBTADC
C7INI
C6INI
C5INI
C4INI
C3INI
C2INI
CBTADC:PWM计数器归零时(CBIF==1时)触发ADC转换
:PWM计数器归零时不触发ADC转换
:PWM计数器归零时自动触发ADC转换。(注:前提条件是PWM和ADC必须被使能,即ENPWM==1,且ADCON==1)
CnINI:设置PWM输出端口的初始电平
:PWM输出端口的初始电平为低电平
:PWM输出端口的初始电平为高电平
mov A, PWMCFG
anl A, #11111011B ; channel-4 start at LOW
mov PWMCFG, A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Set a clock of the waveform generator consists of 4 Fosc
; 设置 时钟选择寄存器 PWMCKS
; 选择4分频系统时钟
PWM时钟选择寄存器PWMCKS
地址:FFF2H(XSFR) 初始值:xxx0,0000B
B7
B6
B5
B4
B3
B2
B1
B0
-
-
-
SELT2
PS[3:0]
SELT2:PWM时钟源选择
:PWM时钟源为系统时钟经分频器分频之后的时钟
:PWM时钟源为定时器2的溢出脉冲
PS[3:0]:系统时钟预分频参数。当SELT2==0时,PWM时钟为系统时钟/( PS[3:0]+1)
mov DPTR, #PWMCKS ; FFF2H
mov A, #00000011B
movx @DPTR, A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Set period as 20
; {PWMCH,PWMCL} <= 19
; 设置 PWM 计数器 PWMCH=00H
; PWMCL=13H
PWM计数器的高字节PWMCH(高7位)
地址:FFF0H(XSFR) 初始值:x000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
-
PWMCH[14:8]
PWM计数器的低字节PWMCL(低8位)
地址:FFF1H(XSFR) 初始值:0000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
PWMCL[7:0]
PWM计数器位一个15位的寄存器,可设定1~32767之间的任意值作为PWM的周期。PWM波形发生器内部的计数器从0开始计数,每个PWM时钟周期递增1,当内部计数器的计数值达到[PWMCH,PWMCL]所设定的PWM周期时,PWM波形发生器内部的计数器将会从0重新开始开始计数,硬件会自动将PWM归零中断中断标志位CBIF置1,若ECBI==1,程序将跳转到相应中断入口执行中断服务程序。
mov DPTR, #PWMCH ; FFF0H
mov A, #00H ; PWMCH should be changed first
movx @DPTR, A
mov DPTR, #PWMCL ; FFF1H
mov A, #13H ; Write PWMCL simultaneous update PWMCH
movx @DPTR, A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;; +-------------------------+
;; | Channel-4 Configuration |
;; +-------------------------+
;; 通道配置
; Set toggle point 1 of Channel-4 as 3
; 设定 PWM4 一次翻转计数器为3 (1 --- 32767)
; pwm2 --- pwm7
PWM4的第一次翻转计数器的高字节PWM4T1H
地址:FF20H(XSFR) 初始值:x000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
-
PWM4T1H[14:8]
PWM4的第一次翻转计数器的低字节PWM4T1L
地址:FF21H(XSFR) 初始值:0000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
PWM4T1L[7:0]
mov DPTR, #PWM4T1H ; FF20H
mov A, #00H
movx @DPTR, A
;
mov DPTR, #PWM4T1L ; FF21H
mov A, #03H
movx @DPTR, A
; Set toggle point 2 of Channel-4 as 16
; 设定 PWM4 二次翻转计数器为16 (1 --- 32767)
PWM4的第二次翻转计时器的高字节PWM4T2H
地址:FF22H(XSFR) 初始值:x000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
-
PWM4T2H[14:8]
PWM4的第二次翻转计时器的低字节PWM4T2L
地址:FF23H(XSFR) 初始值:0000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
PWM4T2L[7:0]
PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
T1== PWM4T1H PWM4T1L T2 = PWM4T2H PWM4T2L
mov DPTR, #PWM4T2H ; FF22H
mov A, #00H
movx @DPTR, A
mov DPTR, #PWM4T2L ; FF23H
mov A, #10H
movx @DPTR, A
; Set Channel-4 output pin as default, and disable interrupting
; 设定 PWM4的控制寄存器 PWM4CR
PWM4的控制寄存器PWM4CR
地址:FF24H(XSFR) 初始值:xxxx,0000B
B7
B6
B5
B4
B3
B2
B1
B0
-
-
-
-
PWM4_PS
EPWM4I
EC4T2SI
EC4T1SI
PWM4_PS:PWM4输出管脚选择位
:PWM4的输出管脚为PWM4:P2.2
:PWM4的输出管脚为PWM4_2:P4.4
EPWM4I:PWM4中断使能控制位
:关闭PWM4中断
:使能PWM4中断,当C4IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
EC4T2SI:PWM4的T2匹配发生波形翻转时的中断控制位
:关闭T2翻转时中断
:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C4IF置1,此时若EPWM4I==1,则程序将跳转到相应中断入口执行中断服务程序。
EC4T1SI:PWM4的T1匹配发生波形翻转时的中断控制位
:关闭T1翻转时中断
:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C4IF置1,此时若EPWM4I==1,则程序将跳转到相应中断入口执行中断服务程序。
mov DPTR, #PWM4CR ; FF24H
mov A, #00H
movx @DPTR, A
; Clear EAXSFR to disable xSFR, return movx-DPTR to normal XRAM access
; 设置端口配置寄存器 P_SW2
; EAXSFR: 扩展xSFR访问控制OFF EAXSFR为0
mov A, P_SW2
anl A, #01111111B
mov P_SW2, A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;; +-------------------------+
;; | Operate PWM output |
;; +-------------------------+
; Enable counter counting, and enable Channel-4 output
; 使能 PWM4
PWM控制寄存器PWMCR
地址:F5H 初始值:0000,0000B
B7
B6
B5
B4
B3
B2
B1
B0
ENPWM
ECBI
ENC7O
ENC6O
ENC5O
ENC4O
ENC3O
ENC2O
ENPWM:使能增强型PWM波形发生器
:关闭PWM波形发生器
:使能PWM波形发生器,PWM计数器开始计数
ECBI:PWM计数器归零中断使能位
:关闭PWM计数器归零中断(CBIF依然会被硬件置位)
:使能PWM计数器归零中断
ENCnO:PWM输出使能位
:相应PWM通道的端口为GPIO
mov A, PWMCR
orl A, #10000100B
mov PWMCR, A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 定时器 1 16位自动重载
TIMER1INIT: ;125毫秒@5.5296MHz
anl auxr,#0bfh ; 定时器时钟 1 12T
anl tmod,#00fh
mov tl1, #000h
mov th1, #01fh
clr tf1
setb tr1
ret
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 定时器 2 16位自动重载
TIMER1INIT: ;125毫秒@5.5296MHz
anl auxr,#0bfh ; 定时器时钟2 12T
anl tmod,#00fh
mov tl2, #000h
mov th2, #01fh
clr tf2
setb tr2
ret
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
转速 2500 3000 3400 3700 4000 转 提转 200
油量 420 310 260 220 190 毫秒
PT1000 <195 <195 <195 <195 <195 度
启动 风机 1700 开始点火 2分钟 PT000 增量30度 熄火 可重复3次
关机 PT1000 下降到 35度 关风机
开机故障检测 实验读取数据
|