一、简介
手机通过蓝牙软件向蓝牙串口模块发送数据,STM32通过串口接收蓝牙串口模块的数据,控制舵机旋转角度开关灯。舵机通过PWM驱动,所以就两个外设配置,串口接收数据,定时器驱动舵机旋转。
二、所需元件
STM32F103C6T6(5元)+SG90舵机(5元)+蓝牙串口透传模块(10元),杜邦线若干。
三、STM32控制程序
①定时器初始化
使用定时器2通道2输出PWM控制舵机的角度,以下为定时器和GPIO脚的初始化配置。
void GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);//GPIOA的引脚1为控制引脚
}
void TIM_Config(uint16_t arr,uint16_t pre)//PWM初始化
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSSttruct;
TIM_TimeBaseInitSSttruct.TIM_Period=arr;
TIM_TimeBaseInitSSttruct.TIM_Prescaler=pre;
TIM_TimeBaseInitSSttruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitSSttruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC2Init(TIM2, &TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
TIM_Config(9999,143);//设置20MS 50HZ
②SG90舵机角度控制
舵机的控制需要一个20MS的时基脉冲,0.5MS对应-90度,2.5MS对应+90度。2MS对应180度,为了方便设置角度,所以创建一个函数进行设置角度程序如下。
void Anglesetting(short int angle)
{
angle=(angle*556+50)/100+750;
TIM_SetCompare2(TIM2, (uint16_t)angle);
}
计算公式由来:当设置-90度时,占空比为0.5MS,对应比较值为250,设置+90度时对应1250,相差1000,共180度,所以1000/180=5.56次/度,0度对应750,所以值=度数*5.56+750,由于变量为整形,所以分子分母*100。
③串口配置(与手机蓝牙通信)
配置串口与蓝牙串口透传模块进行通信,手机连接蓝牙发送数据。
配置波特率为9600(可以根据蓝牙模块更改,蓝牙模块默认9600),打开接收中断。
三、蓝牙APP制作
哔哩哔哩上很多教程,推荐使用App inventor。
视频推荐链接:
https://www.bilibili.com/video/BV1Cy4y1h7ma/share_source=copy_web&vd_source=655cabdfd899891a83c4c5e45f31310f
四、连接
舵机的信号线接PA1,STM32的地与舵机的地一定要在一起,5V供电,蓝牙串口模块正常接。
五、程序与APP
源码也有详细注释,蓝牙APP也在里面。
https://gitee.com/fendaya/simple-switching-light.git