2024-09-01
售卖作品
00

目录

题目
器件
原理
霍尔传感器测速原理:
电机如何调节速度
程序设计
实验报告
实验题目
实验目的
实验器材
实验原理
霍尔传感器测速原理
电机调速原理
定时器中断原理
硬件连接
软件设计
定时器配置
主程序
中断处理程序
实验结果
实验总结

题目

设计基于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);

效果展示:

在这里插入图片描述

在这里插入图片描述

原理图:

在这里插入图片描述

帮助:

cpp
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2

实验报告

实验题目

设计基于MSP430的转速测量仪的软硬件

实验目的

  1. 掌握使用MSP430微控制器进行转速测量的基本方法。

  2. 理解霍尔传感器的工作原理并实现其在转速测量中的应用。

  3. 学习使用OLED显示屏进行数据显示。

  4. 掌握定时器中断的配置和使用。

实验器材

  1. MSP430G2553开发板

  2. 直流5V电机

  3. 霍尔传感器模块

  4. OLED显示屏(0.96寸 IIC通信)

  5. 电源及连接线

实验原理

霍尔传感器测速原理

霍尔传感器能够检测到磁场的存在。当轮子上粘贴了磁铁后,电机带动轮子旋转,每转一圈霍尔传感器会产生相应数量的脉冲信号,通过统计这些脉冲信号可以计算出轮子的转速。

电机调速原理

通过改变电机两端电压来调节电机转速,可以使用滑动变阻器实现电压的调节,电阻越大,电机转速越低,反之亦然。

定时器中断原理

MSP430中的定时器可以配置为周期性中断,通过定时器中断可以实现对霍尔传感器脉冲信号的计数,进而计算出电机转速。

硬件连接

  1. 将霍尔传感器模块的VCC接电源正极(3.3V-5V),GND接电源负极,DO接MSP430的P1.0。

  2. 将OLED显示屏的VCC接电源正极,GND接电源负极,SCL和SDA分别接MSP430的I2C接口。

  3. 将直流电机和滑动变阻器按照实验原理图连接。

软件设计

定时器配置

使用MSP430的定时器配置为200ms中断,通过在中断中统计脉冲信号,计算出每秒和每分钟的转速。

cpp
TA1CCTL0 = CCIE; // 开启CCRx中断 TA1CCR0 = 50000; // 200ms TA1CTL = TASSEL_2 + MC_1 + ID_3 + TACLR; // SMCLK, Up模式, 分频8, 清除定时器

主程序

主程序中初始化显示屏,配置定时器中断,并在主循环中更新显示屏上的转速信息。

cpp
void 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显示屏进行数据显示。实验过程中遇到了一些问题,如定时器配置和中断处理等,但通过查阅资料和调试程序,最终成功解决了这些问题,达到了预期的实验目的。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!