设计基于MSP430的转速测量仪的软硬件。具体要求:
(1)转速测量仪测量范围100-3000r/m,测量精度为1%。
(2)可用任何小电机和传感器。
(3)在OLED上显示转速。
所需要的器件:
(1)一个直流5V电机,一个轮子,一个霍尔传感器。
VCC:接电源正极3.3-5V
GND:接电源负极
DO:模块数字信号输出,有磁感应是输出低电平
(2)oled 0.96寸 IIC通信 四脚
(3)MSP430G2553开发板
霍尔传感器DO:模块数字信号输出,有磁感应是输出低电平。所以在轮子上贴2块磁铁后,电机带着轮子传,轮子每转一圈,霍尔传感器DO会输出2个低电平脉冲。意会一下,霍尔传感器DO的波形是这样:
单片机用定时器设置一个时间间隔比如一秒,数一下有多少个脉冲就可以知道一秒钟轮子赚了多少圈。
下图是一个示意图,从上到下,VCC直接连点击M1,然后电机连接到RT1滑动变阻器。变阻器电阻越大,限制了电机的电流,那电机转速就降低。反之则升高。电容C4是为了存储电能,让电机工作得更顺畅。
定时器中断设置,设置200ms中断,在中断里统计每秒转速和每分钟转速,中断设置:
cpp // 配置 Timer_A1
TA1CCTL0 = CCIE; // 开启CCRx中断
TA1CCR0 = 50000; // 200ms
TA1CTL = TASSEL_2 + MC_1 + ID_3 + TACLR; // SMCLK, Up模式, 分频8, 清除定时器
程序设计上,设计2个不同尺度的时间,一个是1秒钟更新一次timer_count ,timer_count 就是一秒钟电机有多少转。另一个是一分钟更新一次timer_count_minute ,timer_count_minute 就是一分钟电机有多少转。
cpp tim_cnt++;
if (tim_cnt >= 5) {
tim_cnt = 0;
timer_count = timer_count_tmp;
timer_count_tmp = 0;
}
tim_cnt_minute++;
if (tim_cnt_minute >= 300) { //1分钟
tim_cnt_minute = 0;
timer_count_minute = timer_count_tmp_minute;
timer_count_tmp_minute = 0;
}
故也需要一个时间显示,便于观察是否已经更新了显示:
cpp disp[disp_cnt++] = hour / 10 + '0';
disp[disp_cnt++] = hour % 10 + '0';
disp[disp_cnt++] = ':';
disp[disp_cnt++] = minute / 10 + '0';
disp[disp_cnt++] = minute % 10 + '0';
disp[disp_cnt++] = ':';
disp[disp_cnt++] = second / 10 + '0';
disp[disp_cnt++] = second % 10 + '0';
disp[disp_cnt++] = '\0';
OLED_ShowString(16 * 2, 2, (unsigned char *) disp);
当然,也需要显示每秒钟转速显示:
cpp disp_cnt = 0;
disp[disp_cnt++] = timer_count % 1000000 / 100000 + '0';
disp[disp_cnt++] = timer_count % 100000 / 10000 + '0';
disp[disp_cnt++] = timer_count % 10000 / 1000 + '0';
disp[disp_cnt++] = timer_count % 1000 / 100 + '0';
disp[disp_cnt++] = timer_count % 100 / 10 + '0';
disp[disp_cnt++] = timer_count % 10 + '0';
disp[disp_cnt++] = 'r';
disp[disp_cnt++] = '/';
disp[disp_cnt++] = 's';
disp[disp_cnt++] = '\0';
OLED_ShowString(16 * 2, 4, (unsigned char *) disp);
和每分钟的转速显示:
cpp disp_cnt = 0;
disp[disp_cnt++] = timer_count_minute % 1000000 / 100000 + '0';
disp[disp_cnt++] = timer_count_minute % 100000 / 10000 + '0';
disp[disp_cnt++] = timer_count_minute % 10000 / 1000 + '0';
disp[disp_cnt++] = timer_count_minute % 1000 / 100 + '0';
disp[disp_cnt++] = timer_count_minute % 100 / 10 + '0';
disp[disp_cnt++] = timer_count_minute % 10 + '0';
disp[disp_cnt++] = 'r';
disp[disp_cnt++] = '/';
disp[disp_cnt++] = 'm';
disp[disp_cnt++] = '\0';
OLED_ShowString(16 * 2, 6, (unsigned char *) disp);
效果展示:
原理图:
帮助:
cpphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2
设计基于MSP430的转速测量仪的软硬件
掌握使用MSP430微控制器进行转速测量的基本方法。
理解霍尔传感器的工作原理并实现其在转速测量中的应用。
学习使用OLED显示屏进行数据显示。
掌握定时器中断的配置和使用。
MSP430G2553开发板
直流5V电机
霍尔传感器模块
OLED显示屏(0.96寸 IIC通信)
电源及连接线
霍尔传感器能够检测到磁场的存在。当轮子上粘贴了磁铁后,电机带动轮子旋转,每转一圈霍尔传感器会产生相应数量的脉冲信号,通过统计这些脉冲信号可以计算出轮子的转速。
通过改变电机两端电压来调节电机转速,可以使用滑动变阻器实现电压的调节,电阻越大,电机转速越低,反之亦然。
MSP430中的定时器可以配置为周期性中断,通过定时器中断可以实现对霍尔传感器脉冲信号的计数,进而计算出电机转速。
将霍尔传感器模块的VCC接电源正极(3.3V-5V),GND接电源负极,DO接MSP430的P1.0。
将OLED显示屏的VCC接电源正极,GND接电源负极,SCL和SDA分别接MSP430的I2C接口。
将直流电机和滑动变阻器按照实验原理图连接。
使用MSP430的定时器配置为200ms中断,通过在中断中统计脉冲信号,计算出每秒和每分钟的转速。
cppTA1CCTL0 = CCIE; // 开启CCRx中断
TA1CCR0 = 50000; // 200ms
TA1CTL = TASSEL_2 + MC_1 + ID_3 + TACLR; // SMCLK, Up模式, 分频8, 清除定时器
主程序中初始化显示屏,配置定时器中断,并在主循环中更新显示屏上的转速信息。
cppvoid main(void) {
WDTCTL = WDTPW | WDTHOLD; // 停止看门狗定时器
// 配置DCO为16MHz
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
// 配置SMCLK为2MHz
BCSCTL2 = DIVS_3;
/* 初始化显示 */
OLED_Init();
OLED_ShowCHinese(16 * 2, 0, 0);
OLED_ShowCHinese(16 * 3, 0, 1);
OLED_ShowCHinese(16 * 4, 0, 2);
OLED_ShowCHinese(16 * 5, 0, 3);
OLED_ShowCHinese(16 * 0, 2, 4);
OLED_ShowCHinese(16 * 1, 2, 5);
OLED_ShowCHinese(16 * 0, 4, 6);
OLED_ShowCHinese(16 * 1, 4, 7);
OLED_ShowCHinese(16 * 0, 6, 8);
OLED_ShowCHinese(16 * 1, 6, 9);
__bis_SR_register(GIE); // 进入 LPM0 低功耗模式,启用全局中断
while (1) {
// 显示系统时间和转速信息
// 代码略...
}
}
在定时器中断中统计脉冲信号并计算转速,同时更新系统时间。
cpp#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0(void) {
tim_cnt++;
if (tim_cnt >= 5) {
tim_cnt = 0;
timer_count = timer_count_tmp;
timer_count_tmp = 0;
time++;
}
tim_cnt_minute++;
if (tim_cnt_minute >= 300) {
tim_cnt_minute = 0;
timer_count_minute = timer_count_tmp_minute;
timer_count_tmp_minute = 0;
}
}
成功实现了基于MSP430的转速测量仪,能够在OLED显示屏上实时显示电机的转速,测量范围为100-3000r/m,测量精度为1%。下图展示了实验效果:
通过本次实验,掌握了使用MSP430微控制器进行转速测量的基本方法,理解了霍尔传感器的工作原理和使用方法,学习了如何使用OLED显示屏进行数据显示。实验过程中遇到了一些问题,如定时器配置和中断处理等,但通过查阅资料和调试程序,最终成功解决了这些问题,达到了预期的实验目的。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!