CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约234Khz
//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约39Khz
//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方波stm32单片机的PWM模块就是产生方波的,一般式通过设置其相关定时器来实现产生不同频率,不同占空比的方波信号;同时PWM可以是脉冲宽度调制器,通过改变输入PWM的占空比与频率控制开关管的开关状态来改变输出电压,如常用的开关电源适配器,PWM可调风扇等大都都是利用PWM来实现的。电力电子,电机调速领域都有广泛应用,可以调节脉冲宽度的脉冲很多地方都有有、在开关电源里面用来驱动开关管通过改变PWM的宽度就可以实现对输出的控制。在单片机领域使用就更加广泛。电机调速,灯光调亮,电功率调节可能回用到。有二种情况,第一,如果你所使用的8051单片机(例如stc12系列)是带有专用的pwm输出i/o口的话,那就只要控制里面的特殊功能寄存器改变输出占空比就行了,不要外加什么硬件电路的。第二,如果是通入软件模拟pwm输出的话,那就用定时器可以解决的,也不需要外加电路。/---------------
文件名称: PWMC
功能 :单片机脉冲方式产生PWM信号
----------------/
#include <reg52h> // 引用标准库的头文件
#include <absacch>
#include <stdioh>
#define uchar unsigned char
#define uint unsigned int
#define COUNT0 XBYTE [0X0000] // 8254计数器0寄存器地址
#define COUNT1 XBYTE [0X0200] // 8254计数器1寄存器地址
#define COUNT2 XBYTE [0X0400] // 8254计数器2寄存器地址
#define COMWORD XBYTE [0X0600] // 8254控制寄存器地址
/
函数名称: SIGNAL(SIG_OUTPUT_COMPARE1A)
功能 :定时器0中断子程序
入口参数:无
返回值 :无
/
void time0_int () interrupt 1 using 1
{
TR0=0; // 关闭T0
TH0=-(20000/256);
TL0=-(20000%256); //重置20ms计数值
/--------------用8254计数器发送第一路的PWM信号-----------/
COMWORD=0x30; //1MHz时钟作为计数时钟,计数1000次后实现1ms高电平
COUNT0=0xE0;
COUNT1=0x03;
/--------------用8254发送第二路的PWM信号----------------/
COMWORD=0x70; //1MHz时钟作为计数时钟,计数2000次后实现2ms高电平
COUNT0=0xD0;
COUNT1=0x07;
/-------------用8254发送第三路的PWM信号----------------/
COMWORD=0xB0;//1MHz时钟作为计数时钟,计数3000次后实现32ms高电平
COUNT0=0xB0;
COUNT1=0x0B;
TR0=1; //启动T0
}
//主函数
void main ()
{
EA=1; // 开CPU总中断
ET0=1; // 开T0定时器中断
TMOD=0x01; // 开定时器中断
TH0=-(20000/256); //20ms定时器计数初值
TL0=-(20000%256);
/--------------向8254控制寄存器选择计数器0,并对其赋值0-----------------/
COMWORD=0x30;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
/---------------向8254控制寄存器选择计数器1,并对其赋值0------------------/
COMWORD=0x70;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
/---------------向8254控制寄存器选择计数器2,并对其赋值0-----------------/
COMWORD=0xB0;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
TR0=1; //启动定时器0
While (1); //无限次循环
}你这段代码的意思很简单。
所谓PWM 就是 高电平和 低电平,所以你这有定义一个IO拉高拉低
占空比,就是高电平和低电平的比例。
所以,我们需要控制高电平 和 低电平的时间。
那么,CCAP0L=pwm[0]; //初始化spwm输出的占空比
CCAP0H=pwm[0];
CCAP1L=pwm[0]; //初始化spwm输出的占空比
CCAP1H=pwm[0]
就是定义了0 1两个定时器,
一个给高电平,一个给电平。
好,现在高低电平时间都有了,波形也就出来了有二种情况,第一,如果你所使用的8051单片机(例如stc12系列)是带有专用的pwm输出i/o口的话,那就只要控制里面的特殊功能寄存器改变输出占空比就行了,不要外加什么硬件电路的。第二,如果是通入软件模拟pwm输出的话,那就用定时器可以解决的,也不需要外加电路。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)