pwm的理解:

首先明确一点:电机的转动是需要能量的,能量的提供由其电源供给电流的时间所决定。因此pwm其实是提供一个在固定的周期内产生能量的时间。

1 首先pwm是一个可以将不可变直流电流化为可变直流电流的简称也就是讲原先是一条恒定的直流电流,现在变成了一个方波性的周期电流
在没有pwm的单片机上可以使用定时器产生
步骤1:
for example : 产生一个1ms的方波
sbit out = P1^0;
//定时器的初始化
void Init_Timer0(void){
TMOD |= 0x02; //模式设置
TH0 = (65536-500)/256; //初值的设定与单片的分频器有关
TL0 = (65536-500)%256;
EA = 1; //启动定时器
ET0 = 1;
TR0 = 1;
}
//中断产生后方波的产生
void Timer0_isr(void) interrupt 1{
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
//中断产生后P1.0口的输出电位改变
out=~out;
}
步骤2:如果我想要一个不是这样均等的波该怎么办呢?
预想的流程图是这个样子的:
首先我要将这个波变得大一些,这样比较容易分割太小了单片机没法操作因此我需要在中断之后加入一个变量time(ms)
每次产生中断之后time改变,只有time到达一定的值之后输出的电位才发生改变,这样就延长了产生波的时间
unsigned char time; //设置一个全局变量
time++;
if(time==预定值){
time = 0;
out =~ out;
}
这样我就产生了一个时间较长的方波,那我如何改变这个方波的占空比呢,假设我的预定值是一定的比方说10ms,那么在这个10ms内我想要产生4ms的的高电平这样我的电机就会消耗4ms的功率,转速当然也要比对等方波时的慢。因为我的有效功率变小了。那么我需要设置一个值,用这个值划分我的方波,我把它叫做division
unsigned char division;//同样设置一个全局变量
上面的代码是不完整的,所以我进行了改进
division = 4;
if(time<division){ //产生高电平
out = 1;
}else{
out = 0;
}
将此代码加在清零判断之前并将 out =~ out;删除。由此获得了一个间距不等的方波。
一个pwm就这样产生了。

posted on 2014-05-08 11:00  archieve  阅读(1922)  评论(0编辑  收藏  举报