打印
[其他ST产品]

用stm32控制舵机——以stm32F103C8T6为例

[复制链接]
楼主: yellow555
手机看帖
扫描二维码
随时随地手机跟帖
21
yellow555|  楼主 | 2023-7-26 17:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
此时将舵机上电,信号线连接到PA6,可以看到舵机旋转



使用特权

评论回复
22
yellow555|  楼主 | 2023-7-26 17:28 | 只看该作者
五、控制多个舵机
控制一个舵机成功后,进一步控制多个舵机,先以TIM3增加输出通道为例,这里增加Channel2,输出端口配置为PA7
首先配置bsp_servo.h与bsp_servo.c中的CH2

使用特权

评论回复
23
yellow555|  楼主 | 2023-7-26 17:28 | 只看该作者
// TIM3 输出比较通道2
#define            GENERAL_TIM_CH2_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            GENERAL_TIM_CH2_PORT          GPIOA
#define            GENERAL_TIM_CH2_PIN           GPIO_Pin_7

static void GENERAL_TIM_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道1 GPIO 初始化
        RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
       
         // 输出比较通道1 GPIO 初始化
        RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH2_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);
}

static void GENERAL_TIM_Mode_Config(void)
{
  // 开启定时器时钟,即内部时钟CK_INT=72M
        GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

/*--------------------时基结构体初始化-------------------------*/
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;       
        // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
        TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;       
        // 时钟分频因子 ,配置死区时间时需要用到
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
        // 计数器计数模式,设置为向上计数
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
        // 重复计数器的值,没用到不用管
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
        // 初始化定时器
        TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
       
       
        /*--------------------输出比较结构体初始化-------------------*/       
       
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        // 配置为PWM模式1
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        // 输出使能
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        // 输出通道电平极性配置       
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
       
        // 输出比较通道 1
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
       
        // 输出比较通道 2
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
       
                // 使能计数器
        TIM_Cmd(GENERAL_TIM, ENABLE);
}

使用特权

评论回复
24
yellow555|  楼主 | 2023-7-26 17:29 | 只看该作者
然后来到main.c,这里是使用TIM_SetCompare2(GENERAL_TIM ,Compare);对于函数
TIM_SetComparex(TIMy,Compare);设置的是TIMy模块CHx的脉宽。
int main(void)
{
        GENERAL_TIM_Init();
       
        while(1)
        {
                for(int i = 5;i<26;i++)
                {
            TIM_SetCompare1(GENERAL_TIM ,i);
                        SOFT_DELAY;
                }
                for(int i = 5;i<26;i++)
                {
            TIM_SetCompare2(GENERAL_TIM ,i);
                        SOFT_DELAY;
                }
        }
}

使用特权

评论回复
25
yellow555|  楼主 | 2023-7-26 17:29 | 只看该作者
可以看到两个舵机按照程序转动起来。



之后要增加控制舵机的数据,可以先增加TIMx的通道数,一个通用或者高级定时器有四个输出通道,还可以增加新的TIM,达到控制多个舵机的目的。为了避免篇幅过于冗长,这里不挂出具体代码。

使用特权

评论回复
26
yellow555|  楼主 | 2023-7-26 17:29 | 只看该作者
最后再来一个挂载四个的

使用特权

评论回复
27
wilhelmina2| | 2023-9-9 17:09 | 只看该作者
用stm32怎么控制18个舵机?

使用特权

评论回复
28
uptown| | 2023-9-9 18:31 | 只看该作者
如何控制舵机的角度              

使用特权

评论回复
29
albertaabbot| | 2023-9-9 18:44 | 只看该作者
舵机控制芯片有多种,如PCA9685、SPC560P70F5等,需要根据实际需求选择合适的舵机控制芯片。

使用特权

评论回复
30
primojones| | 2023-9-9 18:53 | 只看该作者
舵机通常需要较高的电流来工作,因此在连接舵机时,要确保给它提供足够的电源,并且要与STM32微控制器隔离

使用特权

评论回复
31
deliahouse887| | 2023-9-9 19:07 | 只看该作者
如果舵机需要更大的驱动电流,可以在PWM线上增加适当大小的电阻来提高舵机性能。

使用特权

评论回复
32
wangdezhi| | 2023-9-9 20:39 | 只看该作者
在控制舵机时,要注意避免超过舵机的最大扭矩和速度,以防止损坏舵机。

使用特权

评论回复
33
albertaabbot| | 2023-9-9 21:35 | 只看该作者
可以通过限制PWM占空比或使用软件算法来实现保护措施。

使用特权

评论回复
34
tifmill| | 2023-9-9 22:04 | 只看该作者
求stm32控制四自由度舵机的程序

使用特权

评论回复
35
Henryko| | 2023-9-11 21:50 | 只看该作者
感觉这个宏定义也不是很方便啊

使用特权

评论回复
36
zerorobert| | 2023-9-12 15:38 | 只看该作者
通过控制占空比,来控制舵机的转动角度,在实现控制算法时,主要是PID算法,将目标角度转化为PWM執行器的输出值。

使用特权

评论回复
37
loutin| | 2023-9-12 16:59 | 只看该作者
在程序中正确初始化STM32的PWM输出,并编写相应的控制算法来实现舵机的角度控制。可以使用定时器或软件延时来生成所需的PWM信号。

使用特权

评论回复
38
sanfuzi| | 2023-9-12 17:07 | 只看该作者
使用STM32控制舵机时,需要注意初始角度、电源和PWM信号等关键因素,以便实现精确的控制

使用特权

评论回复
39
updownq| | 2023-9-12 18:38 | 只看该作者
舵机的工作电压通常在3.3V到6V之间,因此需要确保STM32的输出电压能够满足舵机的要求。

使用特权

评论回复
40
sesefadou| | 2023-9-12 18:48 | 只看该作者
为了保护STM32的输出引脚和提供足够的电流给舵机,通常需要使用驱动电路

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则