stc单片机产生pwm,这有一个程序,有人能详细解释下它怎么产生pwm波吗,能逐句详解吗

stc单片机产生pwm,这有一个程序,有人能详细解释下它怎么产生pwm波吗,能逐句详解吗#include <STC12x5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar code pwm[54]={255,240,226,211,196,182,168,154,141,128,115,103,91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,
0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,182,196,211,226,240,255
}; // 反正弦变化
int index=0;
sbit P13=P1^3; //PCA模块0输出
sbit P14=P1^4; //PCA模块1输出

bit zf=0; //前后半周期标志
void init_pca(void)//pca计数器初始化函数
{
CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能
CCON=0x00;
CCAPM0=0x42;//8位PWM输出,无中断
CCAPM1=0x42;//8位PWM输出,无中断
CL=0x00;//清零pca计数器
CH=0x00;
CCAP0L=pwm[0]; //初始化spwm输出的占空比
CCAP0H=pwm[0];
CCAP1L=pwm[0]; //初始化spwm输出的占空比
CCAP1H=pwm[0];
CR=1;//运行pca计数器
}
void init_timer(void)//计数器初始化函数
{
TMOD= 0x01; //计数器0工作在方式模式1
TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4K
TL0 = 0xFF; //T1的计数值低位
AUXR=0xC0;//计数器均工作在1T模式。计数频率11.0592M
ET0 = 1; //开中计数器0断
TR0 = 1; //开启计数器0
}
void int_timer0(void) interrupt 1//计数器1中断函数
{
TH0=0xF7; //重装计数值
TL0=0xFF;
index++; //查表索引

if(index==54) //半周期转换,每半周期分为60份
{
CR=0; //关PCA计数
index=0;
zf=~zf; //半周期标志,zf=0,前半周期,zf=1,后半周期
if(zf) //设置后半周期
{
P13=0;
CCAPM0=0X00; //关闭模块0
CCAPM1=0X42; //设置模块1工作方式
}
else //设置前半周期
{
P14=0;
CCAPM1=0X00; //关闭模块1
CCAPM0=0X42; //设置模块0工作方式
}
CR=1; //开PCA计数
}

if(zf==0) //将下一小格的占空比赋给相应值
{
CCAP0H=pwm[index];
}
else
{
CCAP1H=pwm[index];
}
}
void main(void)
{
P14=0;
P13=0;
EA=1;//开总中断
init_pca();
init_timer();
while(1)//主循环
{
}
}

哥们,这个已经很详细了;
大概说说吧,PWM[54]是定义的一组PWM脉宽输出数组,PWM脉宽输出是0-255;0的时候脉宽输出最大,255的时候脉宽输出最小;
然后那个初始化PCA,初始化定时器0就不说了,你自己下一个手册看下就明白;
然后是中断,每中断一次index加1,然后判断index是不是等于54,意思就是PWM[54]整个数组里面的PWM是不是都送了一次CCAP寄存器;如果都数组都送了一次,将index置零,从头开始送;标志位取反,如果标志位zf=1,让P14输出PWM,P13关闭;,如果zf=0,让P13输出PWM,P14关闭;if(zf==0)后面的语句就是让PWM[54]中的每一个数都送CCAP寄存器一次;

其实按这个程序注释的话,他本意是PWM波形从小变大P14输出,PWM波形有大变小P13输出;但是这个程序的实际效果是P14由小变大再由大变小。然后P14关闭,P13由小变大再由大变小
如此循环;

你最关心的PWM怎么输出:就是这两个语句,CCAP0H=pwm[index]; CCAP1H=pwm[index]; index每中断一次加1,那么index是由0加到54,假如说index=0 ,那么CCAP0H=pwm[0]; ,pwm[0]对应数字里面的255,寄存器CCAP0H=255;这个寄存器等于255,PWM输出就是一个小脉宽;下一次中断CCAP0H=240了,脉宽有增加了一点;至于CCAP0H送一个数据就有脉宽输出,这个是由单片机硬件本身决定的;你看看手册就知道了;
这个已经说得很明白了吧;累死,打字都打了20分钟;追问

那这个程序里是怎么产生中断的,从程序哪里能看出从哪个地方进入中断

追答

TMOD= 0x01; //计数器0工作在方式模式1
TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4K
TL0 = 0xFF; //T1的计数值低位

这个是定时器0初始化,TH0 = 0XF7; TL0 = 0xFF; 这个是定时器的初值,定时时间为2.034ms 就是说只要单片机运行每过2.034ms就进一次中断;

追问

pca计数器初始化函数是什么意思啊,看了手册还是不太懂( •̩̩̩̩_•̩̩̩̩ )

怎么看占空比呢,哎,我刚才的追问怎么被吞掉了( •̩̩̩̩_•̩̩̩̩ )

温馨提示:内容为网友见解,仅供参考
无其他回答

STC12C5410单片机中的pwm模块怎样产生三相正弦波信号
PWM即脉宽调制,调矩形波占空比的,因此它直接输出的是矩形波,要想得到正弦波,需要让这个占空比按正弦波规律输出,然后再对PWM滤波,此时PWM相当于DA 所以你用三路PWM,如上操作,就可以产生三路正弦波 至于相位和让占空比按正弦波规律变化,这写都得在程序中做文章。

STC单片机产生PWM波
我记得STC 这款芯片如果使用自身PCA\/PWM模块的话,频率计算如下图:所以频率=(16M)\/256;这里假设您使用的是16M的晶振,并且在相关寄存器中配置了PCA时钟输入是ECI 如果是其他就是 内部晶振 = SYSclk

stc12 单片机 15KHZ PWM 怎么产生?
ET0=1; \/\/开定时器0中断 TR0=1; \/\/启动定时器0 out_pwm=0;out_pwm=0; \/\/先给低电平,(高低电平的初值会影响中断中的PWM值的设置)while(1);} void int_0(void) interrupt 1 { TH0=(65535-500)\/256;\/\/重新装入初值 TL0=(65355-500)%256;out_pwm=!out_pwm;} ...

STC单片机PWM编程!
4. 了解用单片机产生正弦信号的基本方法。二、实验原理 ADuC848中包含一个12位电压输出DAC模块,DAC模块中寄存器的设置如下:DAC控制寄存器:DACCON NC表示未定义;DACPIN为DAC输出引脚选择;1 = 设置DAC输出引脚为Pin 13 (AINCOM);0 = 设置DAC输出引脚为Pin 14 (DAC);DAC8为DAC转换位数模式选...

stc8h单片机如何设置pwm频率
首先,STC8H不需要外部晶振和外部复位,也可以外接。它的时钟4M-36M。和其它stc芯片的区别是它的运行速度够快,8路16位的高级pwm定时器,4路可以输出互补的脉冲信号,在用这个芯片的时候我发现手册上有些地方讲的不是太清楚,对照了32的手册才明白了原理,今天着重说一下高级定时器的那部分。 ...

求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就...
你是用三路独立的PWM调光用的,PWM调光,为了保证不让人眼产生闪烁,理论上PWM的频率要大于20Hz,而在实际的测试用,一般PWM要大于25Hz才能保证不闪烁.为了保险起见,我们将PWM的频率设定在30Hz左右,那么,周期就是33.333333ms,假设,我们实现10级调光,那个 每级的时间是3.33333ms 然后设置三个变量和一个...

自带PWM功能的STC单片机,在使用内部时钟的前提下能否产生精度高的38KHz...
不可以,因为内部RC振荡随着温度变化,其振荡频率是变化的,其实红外线的载波38K不需要太精确

什么是STC12系列单片机的PCA及跟PWM有什么区别?
其实就是个功能稍微强大点的定时器 - -!比如STC12C2052AD,它的PCA是16位的计数器,计数脉冲可选(时钟分频后做为计数信号,或者外部信号),包含两个比较单元,这两个比较单元可以用来产生比较匹配或者PWM,也就是上面所说的 两个模块。当PCA本身的计数数值与比较匹配相等时,可以触发中断,或者PWM...

spwm产生程序,有没有大神讲一下这个程序的原理,怎么通过这个程序计算占 ...
工作原理你可以看一下STC单片机的PCA相关章节,占空比由CCAP0L,CCAP0H,CCAP1L,CCAP1H的值确定;比如其值为255,那么占空比就为0%,其值为128,占空比就为50%,其值为0,占空比就为100%。

用STC单片机的PCA做定时器,输出PWM
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, P...

相似回答