STM32制御ステアリングギア(複数のステアリングギア、コード付き)
1.基本的な紹介
2.コード
#include "bsp_servo.h"
void Servo_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定义定时器结构体变量
TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体变量
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//配置GPIO引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置GPIO速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//配置GPIO为复用推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIO初始化函数
TIM_TimeBaseStruct.TIM_Period=9999;//设置自动重装载的周期值,计算方法多了
TIM_TimeBaseStruct.TIM_Prescaler=143;//设置预分频系数
TIM_TimeBaseStruct.TIM_ClockDivision=0;//设置时钟分割,0同TIM_CKD_DIV1
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);//定时器初始化函数
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性高
//多舵机,怎么控制,当然是同一个定时器下的4个通道了,所以,下面的8句就很重要。
TIM_OC1Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道1
TIM_OC2Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道2
TIM_OC3Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道3
TIM_OC4Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道4
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //输出比较1预装载寄存器使能
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较2预装载寄存器使能
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较3预装载寄存器使能
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较4预装载寄存器使能
TIM_Cmd(TIM4,ENABLE);//TIM4使能,忘了就前功尽弃了
}
ヘッドファイル
#ifndef __SERVO_H
#define __SERVO_H
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Servo_PWM_Init(void);
#endif
最後に、最も重要なことは、それをどのように使用するかです。もちろんそれは機能です。タイマーの下で特定のチャネルの機能を変更します。TIM_SetCompare1(TIM4、500);注:どのチャネルのデューティサイクルを変更するには、番号1を何に変更する必要があります。
main関数で呼び出されます
int main()
{
/*初始化此处省略*/
while(1)
{
TIM_SetCompare1(TIM4,400);//时间到关闭
delay_ms(500);//此处就看你舵机性能了,连续动作时,如果能反应过来,就不用加延时了,自己实践找规律吧。
TIM_SetCompare1(TIM4,1000);//时间到关闭
delay_ms(500);
//其它舵机也是一样的,TIM_SetCompareX(TIM4,Compare);//时间到关闭
}
}
3.備考
さまざまなデューティー比とそれに対応するステアリングギア角度について、自分で調べてみましょう。計算もわかりやすいです。
4.エラーが発生した場合は、積極的に指摘していただき、ありがとうございます。