找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2178|回复: 7
收起左侧

stm32蓝牙控制舵机问题:想知道如何实现蓝牙控制舵机慢慢转动

[复制链接]
ID:922391 发表于 2021-7-19 16:26 | 显示全部楼层 |阅读模式
#include "stm32f10x.h"
#include "usart.h"
#include "timer.h"
#include "duoji.h"
#include "delay.h"
#include "math.h"
#include "sys.h"

void delay(u8 count)
{
        for(; count!=0 ; count--);
}

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
        usart_Init()
   TIM3_PWM_Init(199,7199)
//        TIM2_PWM_Init(199,719

        while(1)
        {
      
        }
}
void USART1_IRQHandler(void
{
        u8 res;
        res=USART_ReceiveData(USART1)
        switch(res)/

        {
                case'6':duoji1();
           TIM_SetCompare3(TIM3,180);
                break;      
      case'7':duoji2();
                TIM_SetCompare3(TIM3,175);         
                break;
               
  }
}


舵机

#include "duoji.h"
#include "stm32f10x.h"
#include "delay.h"

void TIM3_PWM_Init(u16 arr, u16 psc)  
{
        GPIO_InitTypeDef GPIO_InitTypeSture;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeSture;
        TIM_OCInitTypeDef TIM_OCInitTypeStrue;
      
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
      
        
        GPIO_InitTypeSture.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitTypeSture.GPIO_Pin =  GPIO_Pin_0;
        GPIO_InitTypeSture.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitTypeSture);
      
        
        TIM_TimeBaseInitTypeSture.TIM_Period = arr;
        TIM_TimeBaseInitTypeSture.TIM_Prescaler = psc;
        TIM_TimeBaseInitTypeSture.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitTypeSture.TIM_ClockDivision = 0;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitTypeSture);
      
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
      
        TIM_OCInitTypeStrue.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitTypeStrue.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitTypeStrue.TIM_Pulse = 0;
        TIM_OCInitTypeStrue.TIM_OutputState = TIM_OutputState_Enable;
      
        TIM_OC1Init(TIM3, &TIM_OCInitTypeStrue);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
      
        TIM_Cmd(TIM3, ENABLE);
}

void TIM2_PWM_Init(u16 arr, u16 psc)  
{
        GPIO_InitTypeDef GPIO_InitTypeSture;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeSture;
        TIM_OCInitTypeDef TIM_OCInitTypeStrue;
      
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
      
        
        GPIO_InitTypeSture.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitTypeSture.GPIO_Pin =  GPIO_Pin_3;
        GPIO_InitTypeSture.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitTypeSture);
      
        
        TIM_TimeBaseInitTypeSture.TIM_Period = arr;
        TIM_TimeBaseInitTypeSture.TIM_Prescaler = psc;
        TIM_TimeBaseInitTypeSture.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitTypeSture.TIM_ClockDivision = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTypeSture);
      
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);
      
        TIM_OCInitTypeStrue.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitTypeStrue.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitTypeStrue.TIM_Pulse = 0;
        TIM_OCInitTypeStrue.TIM_OutputState = TIM_OutputState_Enable;
      
        TIM_OC1Init(TIM2, &TIM_OCInitTypeStrue);
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
      
        TIM_Cmd(TIM2, ENABLE);
}

void duoji1(void)
{
//        TIM_SetCompare1(TIM3,195);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,185);      
        delay_ms(1000);
        TIM_SetCompare3(TIM3,180);         
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,175);      
//        delay_ms(1000

}

//void duoji12(void
/
//        TIM_SetCompare1(TIM3,175);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,180);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,185);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,195);      
//        delay_ms(1000

/


void duoji2(void)
{
//        TIM_SetCompare1(TIM2,195);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM2,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM2,185);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM2,180);      
//        delay_ms(1000
        TIM_SetCompare3(TIM3,175);         
        delay_ms(1000);

}

//void duoji22
/
//        TIM_SetCompare1(TIM3,175);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,180);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,185);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,195);      
//        delay_ms(1000

/

回复

使用道具 举报

ID:393699 发表于 2021-7-19 17:31 | 显示全部楼层
TIM_SetCompare1  这个应该是控制单片机PWM的函数吧,通过定时调整函数  可以调整PWM的输出波形,舵机每个角度有对应的PWM频率和周期。蓝牙一般都用的模块吧,直接AT指令,串口发送和接收字符串就行。
回复

使用道具 举报

ID:922391 发表于 2021-7-19 17:34 | 显示全部楼层
1092648746 发表于 2021-7-19 17:31
TIM_SetCompare1  这个应该是控制单片机PWM的函数吧,通过定时调整函数  可以调整PWM的输出波形,舵机每个 ...

如果想要让舵机任意转动角度,经过蓝牙发送指令点一下舵机转一下该怎么实现呢?
回复

使用道具 举报

ID:871393 发表于 2021-7-20 10:10 | 显示全部楼层
新建一个变量, 用你的蓝牙操作去修改那个变量, 再由变量去修改舵机的角度.
类似这种
u8 degree = 90;
set_pwm(degree);
回复

使用道具 举报

ID:922391 发表于 2021-7-20 15:14 | 显示全部楼层
可不可以用一个循环
TIM3_PWM_Init(199,7199);
TIM_SetCompare1(TIM3,i);  
然后对i进行叠加,实现度数的微小变化

回复

使用道具 举报

ID:954170 发表于 2021-7-20 15:38 | 显示全部楼层
控制舵机旋转方法:
1、控制信号(如图H)是一种脉宽调制(PWM)信号,凡是微控制器能轻松的产生这种信号。在此文中,我用的是常用的Arduino开发环境下的微控制器。
2、 脉冲的高电平持续1到2毫秒(ms),也就是1000到2000微秒(μs)。在1000μs时,舵机左满舵。在2000μs时,右满舵。不过你可以通过调整脉宽来实现更大或者更小范围内的运动。
3、控制脉冲的低电平持续20毫秒。每经过20毫秒(50次每秒),就要再次跳变为高电平,否则舵机就可能罢工,难以保持稳定。不过你要是想让它一瘸一拐的跳舞,倒可以采取这种方法。

1、什么是舵机:在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
2、工作原理:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。
回复

使用道具 举报

ID:280000 发表于 2021-8-4 15:04 | 显示全部楼层
单片机输出不同的PWM即可实现
回复

使用道具 举报

ID:914689 发表于 2021-8-4 19:45 | 显示全部楼层
加个PID可以很平缓控制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表