与电机设计参数密切相关
若使用电感续流 则可忽视系统的最高频率要求(主要问题是 高频会加剧电机绝缘的老化频率太高某些能量被电机的电容和电感消化)
频率太低会引起低频震动
所以 普通直流电机的PWM频率 尽量不要超过:400hz 也不要小于100hz
若使用专用电抗续流 则频率可适当提高 大型电机的最高频率若大于1000hz 已经没有意义
你可以先百度下什么是占空比及PWM。然后你再看下你自己的问题就差不多了。IN1=1,IN2=0正转,则可以将IN2对应的PWM占空比设为0,若IN2所连单片机引脚可以设为普通I/O引脚的话,则可设为此项,并设输出为0也可。具体的根据实际情况吧。然后就设置IN1脚所对应的PWM了,其通过改变占空比的大小来进行调压的,这样就能控制电机的转速了。当然你的占空比若是过小的话,这样对应的电压输出很小,电机可能会不转的。至于为什么其能调压,还是回答的第一句的话,弄懂占空比及PWM,自己想下就OK了,这样你会获得更多知识的
楼上的我就**你的成果了,看这问题,程序最好附上解释就知道您也是初学者了。我来解释下楼上的程序。
PWM 是一个从做功的这么一个说法吧 //PWN脉冲宽度调制
同频率方波 占空比越大(正信号占整个周期信号 时间上的比值) 所做功越大 可以想象了吧
/就是说,比如你全输出高电平,功率肯定是最大了,一半高一半低,就是中间功率了,全是低电平,功率就最小了。我调节高电平的时长,功率就会变化,说起来很高深,其实也就这么样了
/
我来写个最简单的 //这真的很简单了
sbit qudong=P^
/都说了要控制电平的高低了,所以至少要一个引脚出来吧,P^的意思是,你想哪个脚都行,P0^0,到P4^7,随便你了/
void delay(unsigned char k)//这个是延时函数
{
unsigned char i;j;
for (i=0;i<k;i++)
for(j=0;j<110;j++);//所谓的延时,因为单片机运行指令要时间,你运行多少个指令,不就过去
//了多少个指令周期过去了么,具体时间是多少,和你的单片机型号和晶
//振有关
}
main() //di第一个
{ qudong=0;//这里拉低电平,关闭电流,作为初始化,你不能一开机机器就转啊转啊,多不好,
while(1)//这里就是程序了,一直运行括号里的东西,直到天荒地老,或者停电。
{ delay(10);//刚刚不是拉低了么,这里延时10,就是低了10的delay的时间过去了。
qudong=1;//现在拉高,后面跟的时间就是高电平的时间了
delay(40);//同理,这里延时40,就是高了40的delay的时间过去了。
qudong=0;//高电平结束,现在又拉低了。
}
//总的来说,这是一个高40,低10的方波,占空比80%。但是有个问题,就是到高电平结束,又拉低了后,会进行一个while(1)的判断,所以不是完整的80%,会有偏差。
当然了 这是个最简单的了 要精确 可以用定时器作为时间延时的函数
//好吧,其实我有一个定时器做延时函数的,但是我不想打字了。。。。上了一天的班,头都是疼的,也不想算计数器初始化的设置参数了,什么TH0 TL0乱七八糟的
void t1(void) interrupt 1 //这就是12M晶振,1秒的定时,时长随便你定,我头疼。
{
TR0=1;//搞个计数器中断
TH0=0x3c;//重新初始化
TL0=0xb0;//这是12M晶振的
timecount++; //中断一次,记个数
)
main()
{
TMOD = 0x01; //选择计数器0的模式
EA=1; // 打开总中断
ET0=1;TR0=1;//开0计时器
TH0=0x3c;//重新初始化
TL0=0xb0;//这是12M晶振的
这里加点代码,
while(1)
{
if(timecount==几)拉高,
else if(timecount==几)拉低。
else if(timecount==几)timecount=0;//丫的,给我重数
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)