pwm
原理部分
PWM-脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。
代码
利用定时器0来定时PWM的周期为1ms分成100个单位
定时器1来控制其他的部分
void Timer0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = (65536-10)/256;
TL0 = (65536-10)%256;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer1_Init(void)
{
TMOD &= 0x0f;
TMOD |= 0x10;
TH1 = (65536-1000)/256;
TL1 = (65536-1000)%256;
TF1 = 0; //清除TF0标志
TR1 = 1; //定时器0开始计时
ET1 = 1;
EA = 1;
}
改变定时器pwm的占空比只需要改变pwm_v的值就可以了。
void Timer0() interrupt 1
{
TH0 = (65536-10)/256;
TL0 = (65536-10)%256;
pwm_c++;
if(pwm_c >= 100)pwm_c = 0;
if(pwm_c >= pwm_v)pwm = 0;
else pwm = 1;
led = pwm;
}
void Timer1()interrupt 3
{
u16 ds_c;
TH1 = (65536-1000)/256;
TL1 = (65536-1000)%256;
if(ds_c++ >= 1)
{
ds_c = 0;
ds1 = 1;
}
}
main部分
void main(void)
{
u8 key_v;
Fuck_Init(0,0);//关闭蜂鸣器继电器
Timer0_Init();
Timer1_Init();
while(1)
{
if(ds1)
{
ds1 = 0;
Ds_Init(pwm_v);
}
key_v = Key_Init();
switch(key_v)
{
case 7:pwm_v += 10;break;
case 6:pwm_v -= 10;break;
}
if((pwm_v>=100)||(pwm_v<=0))
pwm_v = 10;
}
}