///
#ifndef PWM_Drive
#define PWM_Drive
sbit PWM3_OUT=P2^1;
extern void PWM3_Init();
extern void PWM3_Modify_Ser(u16 Dat1,u16 Dat2);
#endif
/
#include <all.h>
void PWM3_Init()
{
P2M1&=0xfd; //1111 1101
P2M0|1=0x02; //0000 0010 I/O 口 推挽输出
P_SW2|=0x80; //1000 0000 P_SW2寄存器的最高位EAXFR 是扩展SFR访问控制使能.允许访问XSFR
PWMCFG=0x00; //配置PWM的输出初始电平为低电平,也就是第一次翻转前输出的电平
PWMCFG寄存器
? CBTATC C7INI C6INI C5INI C4INI C3INI C3INI
复位后 000 0000
CBTADC :PWM计数器归零触发ADC转换控制位, 当它为0, 不会触发ADC转换; 为1就触发
注: 前提是PWM和ADC都要使能, ENPWM = 1 && ADCON = 1
CxINI(x: 2-7) 设置PWMx, 当它为0,表示PWMx输出端口初始电压为低电平, 为1就是高电平
PWMCH=0x03;
PWMCL=0xff; //0--1023 固定周期
PWM计数器(PWMCH&PWMCL)
复位后 0000 0000
PWM计数器是一个15位寄存器, 计数器1~32768之间的任意值都可以作为PWM的周期. PWM波形发生器内部的计数器从0开始计数, 每个PWM时钟递增1. 当内部计数器达到[PWMCH,PWMCL]设置的PWM周期时, PWM波形发生器内部的计数器将从0开始重新计数. 硬件会自动将PWM归零中断标志位CBIF置一, 如果ECBI为1, 则程序将跳转到相应中断执行中断服务程序
PWMCKS=0; //选择PWM的时钟为Fosc/(0+1)
M时钟选择寄存器(PWMCKS)
复位后: 0 0000
SELT2: PWM时钟源选择. 为0, PWM时钟源为系统时钟经过分频器之后的时钟; 为1, PWM时钟源为T2的溢出脉冲
PS[3:0] :系统时钟分频参数. SELT2位为0, PWM时钟频率 = 系统时钟频率/(PS[3:0]+1)PW
M时钟选择寄存器(PWMCKS)
PWM3CR=0x00; //选择PWM3输出到P2.1,不使能 PWM2中断
PWMCR&=0x82; //使能PWM信号输出 1000 0010
PWMCR|=0x82; //使能PWM模块
P_SW2&=~0x80; //关闭访问XSFR
}
void PWM3_Modify_Ser(u16 Dat1,u16 Dat2)
{
static xdata u16 count=0; //刷新率太快会让波形重叠,降低一些
if(count>1000)
{
P_SW2|=0x80; //1000 0000 允许访问XSFR
PWMCR&=0x7f; //0111 1111 修改占空比前,关闭寄存器最高位,关闭PWM功能
PWMCFG&=0x00; //配置PWM的输出初始电平为低电平,也就是第一次翻转前输出的电平
PWM3T1=Dat1; //设置 PWM3第一次反转的 PWM计数
PWM3T2=Dat2; //设置 PWM3第二次反转的 PWM计数 一个周期内第二次反转减去第一次反转等于高电平时间
PWMCR|=0x80; //1000 0000 修改之后重新 允许PWM功能
P_SW2&=~0x80; //不允许访问XSFR
}
}