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;           //GPIOF9
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_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脉冲宽度调制模式2
 	TIM_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,具体看芯片晶振)
在这里插入图片描述

  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值