如何用51单片机来产生pwm波来驱动5v的小电机
我是一名学生,想利用寒假做点东西玩。现在想用51单片机来产生的pwm波,但是单片机直接出来的脉冲电压不能驱动电机,所以需要经过一个外围的电路来产生一个可以驱动5v的小电机...
我是一名学生,想利用寒假做点东西玩。现在想用51单片机来产生的pwm波,但是单片机直接出来的脉冲电压不能驱动电机,所以需要经过一个外围的电路来产生一个可以驱动5v的小电机的脉冲驱动电压,现在我想得到一个好的电路,或者有什么好的芯片,
希望大虾们给我一点建议,同时我也想在此基础上做出一个按键调速的电路,做出一个测速调速一体的小制作。希望建议详细一点最好,促进大家的技术能力提高。
我的分也不多,小弟谢谢了先,只为交流学习,促进进步。
如果我直接用单片机输出的pwm来驱动一个三极管,然后在三极管两端接电源和电机,这样来使电机获得pwm的驱动电压,你们看行不?会有什么问题呢 展开
希望大虾们给我一点建议,同时我也想在此基础上做出一个按键调速的电路,做出一个测速调速一体的小制作。希望建议详细一点最好,促进大家的技术能力提高。
我的分也不多,小弟谢谢了先,只为交流学习,促进进步。
如果我直接用单片机输出的pwm来驱动一个三极管,然后在三极管两端接电源和电机,这样来使电机获得pwm的驱动电压,你们看行不?会有什么问题呢 展开
11个回答
展开全部
51没有硬件的PWM,得全靠软件模拟。
调速程序可以用定时器做,首先设置两个定时用的全局变量,一个代表高电平时间一个代表低电平时间。
先给定时器初值(既那两个全局变量中的一个),溢出后触发中断,在中断里设置另另一个初值并且取反PWM的输出端口,两个初值轮流给定时器,就可以任意调整占空比,占空比取决于两个初值。
PWM输出后,驱动三极管,后面接上电机就是了。
按键调速也不难,看你具体的按键处理程序了,通过获得的键值控制上面说的两个全局变量就可以了。
测速可以用计数器做,得到计数值处理一下即可。
如果是自动调速,那需要做点简单的算法程序。
反正51有那么多I/O口,再来一个转速显示什么的也可以。
调速程序可以用定时器做,首先设置两个定时用的全局变量,一个代表高电平时间一个代表低电平时间。
先给定时器初值(既那两个全局变量中的一个),溢出后触发中断,在中断里设置另另一个初值并且取反PWM的输出端口,两个初值轮流给定时器,就可以任意调整占空比,占空比取决于两个初值。
PWM输出后,驱动三极管,后面接上电机就是了。
按键调速也不难,看你具体的按键处理程序了,通过获得的键值控制上面说的两个全局变量就可以了。
测速可以用计数器做,得到计数值处理一下即可。
如果是自动调速,那需要做点简单的算法程序。
反正51有那么多I/O口,再来一个转速显示什么的也可以。
展开全部
1 软件延时法
利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。
程序如下:
#include<reg52.h>
sbit pwm=P1^0;
main()
{
while(1)
{
pwm=1;
delayus(60);//置高电平后延时60us,占空比60%
pwm=0;
delayus(40);
}
}
void delayus(uint x)
{
while(x--);
}
可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。
2 定时器产生pwm
这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。
2.1 注意事项
2.2.1中断服务程序的内容。
一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。
2.2.2定时器装入初值的问题。
装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。
2.2 定时器工作方式
在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。
2.3 定时器初值的计算
设占空比为α,频率为f
产生高电平时装入定时器高8位的值应为
产生高电平时装入定时器低8位的值应为
显然,产生低电平时的公式只要把α换成(1-α)就行了。
然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。
修改后的公式如下:
a为100倍占空比,fr为0.01倍频率
TH0 = (65535-a*100/fr)/256;//高位初值
TL0 = (65535-a*100/fr)%256;
同样,低电平的公式只需把a换成(100-a)即可。
注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。
利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。
程序如下:
#include<reg52.h>
sbit pwm=P1^0;
main()
{
while(1)
{
pwm=1;
delayus(60);//置高电平后延时60us,占空比60%
pwm=0;
delayus(40);
}
}
void delayus(uint x)
{
while(x--);
}
可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。
2 定时器产生pwm
这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。
2.1 注意事项
2.2.1中断服务程序的内容。
一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。
2.2.2定时器装入初值的问题。
装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。
2.2 定时器工作方式
在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。
2.3 定时器初值的计算
设占空比为α,频率为f
产生高电平时装入定时器高8位的值应为
产生高电平时装入定时器低8位的值应为
显然,产生低电平时的公式只要把α换成(1-α)就行了。
然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。
修改后的公式如下:
a为100倍占空比,fr为0.01倍频率
TH0 = (65535-a*100/fr)/256;//高位初值
TL0 = (65535-a*100/fr)%256;
同样,低电平的公式只需把a换成(100-a)即可。
注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-07-04 · 知道合伙人教育行家
hi漫海feabd5e
知道合伙人教育行家
向TA提问 私信TA
知道合伙人教育行家
采纳数:6749
获赞数:129943
本科学历,毕业后从事设计工作;现任标码石材科技有限公司设计员。能决绝结构设计方面中等难度问题。
向TA提问 私信TA
关注
展开全部
51没有硬件的PWM,得全靠软件模拟。调速程序可以用定时器做,首先设置两个定时用的全局变量,一个代表高电平时间一个代表低电平时间。
先给定时器初值(既那两个全局变量中的一个),溢出后触发中断,在中断里设置另另一个初值并且取反PWM的输出端口,两个初值轮流给定时器,就可以任意调整占空比,占空比取决于两个初值。
PWM输出后,驱动三极管,后面接上电机就是了。
按键调速也不难,看你具体的按键处理程序了,通过获得的键值控制上面说的两个全局变量就可以了。测速可以用计数器做,得到计数值处理一下即可。如果是自动调速,那需要做点简单的算法程序。
先给定时器初值(既那两个全局变量中的一个),溢出后触发中断,在中断里设置另另一个初值并且取反PWM的输出端口,两个初值轮流给定时器,就可以任意调整占空比,占空比取决于两个初值。
PWM输出后,驱动三极管,后面接上电机就是了。
按键调速也不难,看你具体的按键处理程序了,通过获得的键值控制上面说的两个全局变量就可以了。测速可以用计数器做,得到计数值处理一下即可。如果是自动调速,那需要做点简单的算法程序。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以利用定时器来实现。打个比方:以一秒为单位,定时器设为50MS,这样进中断20次为一秒;设置两个变量T和U,每进中断一次T自加一,变量U由按键控制,每按一次键U自加一;在中断里,T和U相比较,当T小于U时,就叫单片机PWM输出端口为低电平,当T大于U时就叫单片机PWM输出口为高电平;同时当T自加到21时就置为0,U也是如此。这样你就可以通过按键来改变PWM波的占空比,从而改变电机转速,同时也可以根据U的值换算成电机转速值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
驱动电机的话外围电路中应该要用到数模转换芯片就是D/A(毕竟直接用51在实际中是不好驱动电机的),此外还应该用到运放,你找本书看看,有一些关于电子小制作的书上面都有完整的原理图和程序,要是你要自己研究那么你需要下载一些关于数模芯片和运放的资料
给你个网站是专门下载芯片资料pdf的
www.alldatasheet.com是个国外的网站所以资料也全是英文的
国内的有21实际IC不过资料都是比较老的
给你个网站是专门下载芯片资料pdf的
www.alldatasheet.com是个国外的网站所以资料也全是英文的
国内的有21实际IC不过资料都是比较老的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询