上一章介绍了气体检测传感器,可以检测室内的有害气体浓度,当室内有害气体浓度超标或者温度过高时,我们一般都会开窗通风,那就需要一个执行模块来执行开窗或者关窗的动作。所以这章介绍一款舵机模块,来模拟开窗或者关窗操作。
下图就是SG90舵机模块图片,图中方框的部位时舵机的摆臂,这个摆臂可以用来模拟窗的打开和关闭,下面会有视频展示。
?该模块是利用定时器输出周期为20ms的PWN信号来驱动摆臂摆动,而摆臂摆动的角度与一个周期(20ms)内的高电平持续时间有关,具体如下图所示,左边的时间是一个周期(20ms)内高电平的时间,右边是所对应的是转动角度。
下面这图是通过逻辑分析仪抓出来的PWN波形,图中1到3的时间约为20ms,即周期为20ms,1到2的时间是这个周期内高电平的持续时间,1到2的时长决定了舵机模块的摆臂转动几度。提示:如果不了解定时器PWN相关知识,可以去哔哩哔哩搜索? 野火STM32 去学习定时器相关内容。
舵机模块到手后,就可以开整了,首先模块上引出了3根线,分别是连接5V的VCC引脚,接地的GND引脚和接收PWN信号的信号线。关注了公众号的同学可以发送“第九章”获取资料链接,没有关注的同学,评论区留下邮箱,按照资料里提供的接线图,用杜邦线将SG90舵机模块与STM32F103C8T6连接起来,然后将提供的代码编译并烧录进STM32F103C8T6单片机即可看到效果。
接下来讲一下代码。
第7行 uint8_t?Angle 声明变量Angle用来存储舵机要转动的角度。
第9行 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2) 设置中断优先级分组。
第11行 delay_init( ) 初始化延时函数,执行这条语句后,延时效果才会准确。
第13行 Servo_Init() 函数内有两个函数(下图所示):TIM2_Init(SERVO_TIM_ARR,SERVO_TIM_PSC)?初始化定时2的2通道输出周期为20ms的PWN信号;Servo_angle(5) 是设置舵机模块转动5°,我们后面都是用Servo_angle( )函数来设置舵机的转动,而转动的角度由括号里的参数值决定,参数值可写0~180(提醒:Servo_angle( )函数内部做了保护措施——当参数值小于5时,舵机转动角度不会小于5°,参数值大于175°时,舵机转动角度不会大于175°)。
?第15~28行 实现舵机从5°开始转动到175°,然后从175°转动到5°。实现舵机转动的函数就是第19行和第24行的Servo_angle( )函数,想要转动的角度写在括号里即可,就这么简单。
例程实现效果如下:
?正好第八章我们实现OLED显示环境的温湿度、二氧化碳和甲醛的浓度,现在顺便将SG90舵机模块的功能移植到第八章的代码中,实现当 CO2浓度大于500ppm时打开窗户,CO2浓度小于420ppm时关闭窗户,下面的视频是演示移植的过程。
提示:视频中有错,CO2浓度是ppm而不是ppd
效果如下所示:
(温湿度模块坏了,所以温湿度数值显示为0,代码是没问题的,视频中实物制作很简陋,只是起演示作用,自行制作实物时,可以做的完美一点)
|