首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于MSP430的控制电机并测速度系统设计与调试

基于MSP430的控制电机并测速度系统设计与调试

 前言
  最近在调一个MSP430单片机控制电机并测速度的电路。整个电路从设计制作到调试成功,花了将近四天时间,中间Bug多多,不过最后都一并解决了。
  废话不多说,直接进入主题,先说说我这个系统。下面Figure 1是MSP430主控制部分,用的芯片是MSP430G2553单片机(11、12号引脚是反过来滴),第一个是Pro Download接口,顾名思义,就是程序下载口,我用的MSP430G系列的launchPad 开发板连接到我设计的板子上的,通过这几个接口利用launchPad 即可下载程序,为了方便布线,我打乱了这几个接口的顺序。PWM1和PWM2接口是连接到H桥的两个接口,这里使用了G2553的定时器A1产生PWM。CAP_P12是光电对管连接到比较强后输入到单片机的一个捕获接口,因为这里可以用定时器A0的捕获接口,使用定时器的捕获功能,可以使得程序设计更为简单。整个系统利用了两个定时器,并结合中断,使得整个系统都处于休眠状态,功耗可以做得比较低(但由于电机和12864的存在,这里的低功耗程序设计显得毫无意义额。。。)。另外还有一个12864的串行外部接口(SPI)三根线。



  再放一个三线控制13864的图。由于MSP430x2xx系列是3.3V的器件,这里用到了一个245芯片来转换电平电压(CS和SCLK的顺序反了,后来布线的时候改的)。初学者往往会遇到一个问题,就是为什么我的12864的滑动变阻器调了,12864的亮度都不变呢,我在这里只提一点:注意你的复位引脚的电平。


  H桥电路太常见,百度出来一抓一大把。


  至于H桥原理神马的,我就不在这里多说了。不懂就百度吧,实际上学过三极管的,稍微静下心来分析一个,都可以看得懂的。下面是一个比较器的电路,用的是光电对管发射信号,经黑线反射以后PHOTO上产生一定的电压值,做电路的时候实测 LM358的输入电压高达0.6V(哈哈,其实也不高…),右边的LM358构成一个比较器,VCC为5V电压,经10K和50欧姆电阻分压以后LM358的2号引脚的电压大致为0.5V<0.6V,满足电路设计要求。后加一个1K电阻保护后级单片机(哈哈,这个电阻方便了我后面的滤波)下面说说问题所在吧。



 调试的时候发现了一个非常纠结的问题。数据总是莫名其妙地显示200转/s甚至是1000转每秒,实际上,我这个电机的转动速度最大也就110转每秒,这些个数据显然都是错误的。反复检查定时器的捕获程序,检查了好几遍,加上有写了一年的430单片机程序的经验,对这个G2553的内部寄存器相当熟悉,反复分析,100%确定程序没有任何问题。那么问题在哪里呢?后来分析了一段代码。

  这个函数是将捕获到的定时器的脉冲计数值送到12864的一个中间转换函数,temp显示的转速,由于CPU 时钟用的1MHz,电机那里有四个黑带,所以实际的转速应该是250000/tempData,得到这个数据后转换成ASCII码,再送到12864显示。问题出现在这里,12864显示数据1000+,说明temp = 1000+,比实际的数据100+大了10倍。那么也就意味着tempData的数据比实际的真实数据小了10倍,也就是说定时器两次捕获时间的间隔比常规的要小很多,为什么会小了那么多倍呢。
  思来想去,灵光一闪,哎呀,对了!由于电机的胶布粘贴得不均匀,产生了大量的不均衡噪声,使得比较器的输出含有大量的高频分量,由于噪声的存在,使得定时器的捕获时间间隔变小!从而出现了显示数据偏大的结果。想到问题所在,那么怎么解决掉呢。查看原理图,发现运算放大器的输出端接有一个1K的电阻,哎呀玛雅,灵感方案突然就来了,做个简单的RC低通滤波器不久完了?想到方案以后那么电容的值又该怎么选了?在草稿纸上做个简单的分析,现将草稿纸上的内容mathtype搬到Word上来。
  电容的阻抗表达式:

  把运放的输出结果看成一个电压源,其输出电压等于RC滤波网络的输入电压假设其值为:


  那么上图所示的Vout的输出表达式为

  为了方便分析,我们假设Vi为1V,并且不考虑相位问题,取Vout的模可得

  输出表达式与输入频率的关系找到了,那么我们的电容值又该怎么设计呢?考虑到我们的光电管经过比较器输出以后的频率最大为500Hz,那么我们设计一个‐3dB在500Hz左右的滤波器即可。用MATLAB写个小程序。
  R = 1000;
  f = 0:0.01:1000;
  w = 2*pi*f;
  C1 = 0.001 * 10^-6;%%uF
  C2 = 0.01 * 10^-6;%% uF
  C3 = 0.1 * 10^-6;%% uF
  C4 = 1 * 10^-6;%% uF
  C5 = 0.3 * 10^-6;%% uF
  y1 = sqrt((1./(1+w.*w*R^2*C1^2)).^2 +
  ((w*R*C1)/(1+w.*w*R^2*C1^2)).^2);
  y2 = sqrt((1./(1+w.*w*R^2*C2^2)).^2 +
  ((w*R*C2)/(1+w.*w*R^2*C2^2)).^2);
  y3 = sqrt((1./(1+w.*w*R^2*C3^2)).^2 +
  ((w*R*C3)/(1+w.*w*R^2*C3^2)).^2);
  y4 = sqrt((1./(1+w.*w*R^2*C4^2)).^2 +
  ((w*R*C4)/(1+w.*w*R^2*C4^2)).^2);
  y5 = sqrt((1./(1+w.*w*R^2*C5^2)).^2 +
  ((w*R*C5)/(1+w.*w*R^2*C5^2)).^2);
  plot(f,y1,f,y2,f,y3,f,y4,f,y5);
  title(‘RC滤波器设计’);
  legend(‘0.001uF’,‘0.01uF’,‘0.1uF’,‘1uF’,‘0.3uF’);
  xlabel(‘频率/Hz’);
  ylabel(‘输出幅频/V’);
  在测试C的时候从1nF开始测试,得到下面的输出曲线,从图中我们可以看到,从0Hz到1000Hz,输出几乎都是1,不变,1nF的电容不符合我们的设计要求。再加大,测试104电容,104电容即0.1uF,得到的输出幅频特性曲线如下,显然不符合我们的设计要求,500Hz‐3dB处还差一点点,再加大10倍,测试1uF.
  下面这张是1uF的测试图,显然‐3dB小于500Hz了。也不符合设计要求,经过反复测试并结合手头上有额电容容值,选定474电容,得到幅频特性曲线也较为理想。敲定电容值以后已经迫不及待把电容焊上去了。焊接完毕以后,长时间观察,12864没有再出现200转/秒或者1000转/秒的显示值,也就是说设计的滤波器已经起到效果了!做成以后兴奋了一小下。兴奋之余,想到既然是高频噪声的影响,那么何不看看它的频谱图呢,一想到,果断从科协搬来一台数字示波器,测试了安装RC滤波器前的FFT图形和安装RC滤波器后的FFT图形,现贴在这里。从两个图中,很明显地可以看到安装滤波器前裙子噪声非常明显,安装后,裙子噪声基本没有了!!!,看到这里,我又忍不住兴奋了一下。



  解决所有问题以后大松一口气,终于想通了复位电路与简单的RC滤波电路。相比51单片机的高电平复位电路,其实原理也是一样的——高通滤波器。

返回列表