舵机"/>
STM32F407ZGT6控制舵机
STM32F407ZGT6核心板控制舵机
- 大概思路
- 定时器初始化
- 改变占空比
大概思路
控制舵机主要由单片机输出PWM波(可调脉冲宽度)。控制定时器(高级,通用均可)TIMX_init(int arr,int psc)产生可控方波,改变arr设置其周期为20ms(可使用逻辑分析仪测周期频率等),频率的计算为: F = TIM_CLK/{(arr+1)*(psc+1)}。然后通过改变占空比来改变高电平持续时间从而改变舵机旋转角度,通常为0.5ms对应0度,2.5ms对应180度,其它角度可换算。
定时器初始化
使用的定时器为TIM9
void TIM9_init(int arr,int psc) //舵机
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能时钟GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9);GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_TIM9);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOE,&GPIO_InitStructure); //初始化TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
///**************TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//输出同相TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_Pulse = 500; TIM_OC1Init(TIM9, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = 500; TIM_OC2Init(TIM9, &TIM_OCInitStructure); TIM_Cmd(TIM9, ENABLE); //使能TIM9}//*************
main函数调用
TIM9_init(servoArr-1,410-1);// 初始化
TIM_SetCompare1(TIM9,1024);//改变占空比
改变占空比
TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t CCR)
具体通道可定时器可设置。
占空比P=CCR/(ARR+1)
ARR即定时器初始化的ARR,CCR可视为周期
比如ARR设置为8200时周期为20ms,要设置0.5ms的占空比,即
0.5 / 20 = CCR /(8200+1),可求CCR
PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
(不一定为72M,具体看芯片晶振)
更多推荐
STM32F407ZGT6控制舵机
发布评论