- 模块介绍
stm32mini板子通过手机蓝牙控制舵机
本文章介绍基于stm32mini板子蓝牙控制舵机的程序
一、HC-05原理图以及工作原理

二、使用步骤
1.初始化蓝牙串口
代码如下:
u8 HC05_Init(void)
{
u8 retry=10,t;
u8 temp=1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); //开启时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用函数初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置速率为50Mhz
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化
GPIO_SetBits(GPIOC,GPIO_Pin_4);
USART2_Init(9600); //设置波特率为9600
}
2.设置pwm用来控制舵机
代码如下:
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
3.进入主函数编写程序
代码如下:
int main(void)
{
u8 a;
u8 b;
u8 reclen=0;
delay_init();
TIM1_PWM_Init(199,7199);//不分频,pwm频率===(7200*200)/72000000=0.02=20ms
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600);
HC05_Init();
while(1)
{
if(USART2_RX_STA&0X8000)
{
for(a=0;a<3;a++)
{
pwm[a]=USART2_RX_BUF[a]; //设置一个数组存放接收到的数字
}
reclen=USART2_RX_STA&0X7FFF; //得到数据长度
USART2_RX_BUF[reclen]=0; //加入结束符
angle=(pwm[0]-'0')*100+(pwm[1]-'0')*10+pwm[2]-'0'; //将接收到的数据转换为角度
u2_printf(" angle:%d\r\n",angle); //发送旋转角度
USART2_RX_STA=0; //标志位清零
}
b=195-(angle/45)*5;
TIM_SetCompare1(TIM1,b);
}
}
总结
硬件连接舵机接mini板子上5v引脚,pwm脚连接PA8.
这是我的第一次博客,如有错误,请大家多多包涵