求STC12C5A32S2的可变pwm程序,可用程序控制的pwm波
发布网友
发布时间:2022-05-23 13:50
我来回答
共2个回答
热心网友
时间:2023-10-23 17:17
利用STC的单片机产生SPWM波程序如下:
/*************spwm产生程序******/
/*晶振24.576M,spwm波形19.2KHz*/
#include <STC12C5A16S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar code pwm[]={11,32,52,73,92,111,129,145,160,173,185,195,203,209,214,
216,214,209,203,195,185,173,160,145,129,111,92,73,52,32,11,0};
uchar index;
void init_pca(void)//pca计数器初始化函数
{
CMOD=0x04;//计数器0的溢出为PCA计数器的时钟源
CCON=0x00;
CCAPM1=0x42;//8位PWM输出,无中断
CL=0x00;//清零pca计数器
CH=0x00;
CCAP1L=pwm[0]; //初始化spwm输出的占空比
CCAP1H=pwm[0];
CR=1;//运行pca计数器
}
void init_timer(void)//计数器初始化函数
{
TMOD= 0x12; //计数器0工作在方式模式2,计数器1工作在方式1
TH0 = 0xFB;//T0的计数值为5,把时钟源5分频
TL0 = 0xFB;
TH1 = 0x1E;//T1的计数值为7680,若是24.576M晶振,则中断频率为24.576M/7680=3.2K
TL1 = 0x00; //T1的计数值低位
AUXR=0xC0;//计数器均工作在1T模式。计数频率24.576M
//ET0 = 1; //开中计数器0断
ET1 = 1; //开计数器1中断
TR0 = 1; //开启计数器0
TR1 = 1; //开计数器1
}
void int_timer1(void) interrupt 3//计数器1中断函数
{
CR=0;
index++; //查表索引
TH1=0xE2; //重装计数值
TL1=0x00;
CCAP1H=pwm[index%32];//改变pwm的占空比
CR=1;
}
void main(void)
{
EA=1;//开总中断
init_pca();
init_timer();
while(1);
}
热心网友
时间:2023-10-23 17:18
PWM的频率=PCA的时钟输入源频率/256.
所以你用11.0592MHZ的话最高就只有11.0592M/256=43KHZ;如果PCA的时钟用定时器T0的溢出率的话,可以对系统时钟源1到256的分频。这样最低就有43K/256=168HZ了。完全可以产生200HZ的。
追问答非所问呢