//****************pwm.h********************************
#define Start_PWM() CR = 1 //PCA计时器开始工巧圆作
#define Stop_PWM() CR = 0 //PCA计时器停止工作
extern void InitPWM()
extern void ChangePWM(uint16 f)
//****************pwm.C********************************
#include "pwm.h"
#include "stc15F2k60s2.h"
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
static uint16 data frequency
static uint16 data value
void PCAisr() interrupt 7
{
CCF1 = 0 //清中断标志
CCAP1L = value
CCAP1H = value >>8 //更新比较值
value += frequency //累搏帆加
}
void SetPWMFrenquency(uint16 frq)
{
frequency=frq
value = frequency
CCAP1L = value //将值得低8位赋给CCAP1L
CCAP1H = value >>8 //高8位赋给CCAP1H
value += frequency //累加,为下一次赋值做好准备。产生同固定频率的方波就靠它了。
}
//p2.6/CCP1_3
void InitPWM()
{
ACC = P_SW1
ACC &= ~(CCP_S0 | CCP_S1) //CCP_S0=0 CCP_S1=1
ACC |= CCP_S1 //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
P_SW1 = ACC
CCON = 0//初始化PCA控制寄存器
//PCA定时基宽雹器停止
//清除CF标志
//清除模块中断标志
CL = CH = 0 //复位PCA计数寄存器
CMOD = 0x08 //设置PCA时钟源为sysclock,禁止PCA计数器溢出中断
CCAPM1 = 0x4d//0100 1101//PCA模块1为16位定时器模式,同时反转(P2.6)口
PPCA = 1 //中断优先级
SetPWMFrenquency(12000) //frq=24000000/2/1000=12000,每秒钟1000hz
}
void ChangePWM(uint16 frq)
{
Stop_PWM() //停止PCA计时器
CL=CH=0 //PCA计数器清零
CCF1=0 //PCA1的中断标记清零
SetPWMFrenquency(frq)
Start_PWM()
}
void PWM_init (void){//PWM初始化函数CMOD=0x02//设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
//CMOD=0x00//设置颂携槐PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约3.9Khz
//CMOD=0x04//设置PCA定时器,计数频率为定时器0的溢出率,如果让定时器0设为16位计数模式,其溢出频率可以在很大范围内调节,从而以产生很高或很低的PWM频率
CL=0x00
CH=0x00
CCAPM1=0x42//PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00//设置PWM1初始值与CCAP0H相同
CCAP1H=0x00// PWM1初始时为0
CR=1//启动PCA定时器
}
实际上要产生低频率的PWM波,不用其硬件PWM功能完全可以野友
用定时器中断方式即可实现
让定时器 200us中断一次(中断不算频繁呀) ,设一变量a,每隐友次中断a加1,100次就是20ms,,另设一变量b,数值在1-100之间,每次中断比较a和 b的大小,如果a<b,则引脚 输出高电平,否则为低电平,这样通过改变b的值,就可实现频率为50HZ,占空比1-100%可调的PWM方波
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)