基于STM32F4的舵机控制

发布者:BlossomSunrise最新更新时间:2018-06-19 来源: eefocus关键字:STM32F4  舵机控制 手机看文章 扫描二维码
随时随地手机看文章

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;

   2.5ms-----------180度;

对于stm32来说,我们可以使用定时器PWM输出来控制舵机。

下面给出封装的舵机控制程序:




第一步:初始化定时器

void initServoPWM(TIM_TypeDef* TIMx,uint32_t RCC_APB1Periph_TIMx)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


//开启TIMx时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE);

//配置TIMx
TIM_DeInit(TIMx); 
TIM_TimeBaseStructure.TIM_Period = 2000;//20ms 50频率
TIM_TimeBaseStructure.TIM_Prescaler =819;//定时器分频系数,定时器时钟为82MHz,分频后得0.01MHz,即10kHz,0.1ms定时器加1
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
}




第二步:初始化PWM输出通道

void initServoChannel(GPIO_TypeDef* GPIOx,uint32_t RCC_AHB1Periph_GPIOx,u16 GPIO_Pin_x,uint16_t GPIO_PinSourcex,uint8_t GPIO_AF_TIMx,TIM_TypeDef* TIMx,u8 ch,u16 servoInitAngle)
{
servo_angle=servoInitAngle;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
//配置复用功能,AGPIO1复用位TIMx
GPIO_PinAFConfig(GPIOx,GPIO_PinSourcex,GPIO_AF_TIMx);

//配置PWM输出管脚 初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//设置为复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//复用推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOx, &GPIO_InitStructure);

//PWM模式设置 与通道设置TIMx_CHx,每个定时器只有一个频率,每个通道可以设置不同的占空比
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//模式PWM1,无论定时器是向上计数还是向下计数,计数值>有效值时为有效电平。PWM2模式相反        
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较使能
TIM_OCInitStructure.TIM_Pulse = servoInitAngle*200/180+50;//设置比较值,写CCRx,当计数器到达100时,电平发送跳变,即设置CCRx的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//设输出极性为高,即有效值为高电平,当计数器<200时,PWM为高电平

switch(ch)//选择pwm通道
{
case 1:
TIM_OC1Init(TIMx, &TIM_OCInitStructure);//通道2初始化
TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
case 2:
TIM_OC2Init(TIMx, &TIM_OCInitStructure);//通道初始化
TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
case 3:
TIM_OC3Init(TIMx, &TIM_OCInitStructure);//通道初始化
TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
case 4:
TIM_OC4Init(TIMx, &TIM_OCInitStructure);//通道初始化
TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
}
TIM_ARRPreloadConfig(TIMx, ENABLE);//使能自动重装载寄存器允许位
//开启TIMx
TIM_Cmd(TIMx, ENABLE); 
}




第三步:通道改变占空比控制舵机转动的角度:

void setServoAngle(int angle,TIM_TypeDef* TIMx,u8 ch)
{

if(angle>180)
angle=180;
else if(angle<0)
angle=0;

servo_temp=angle*200/180+50;//计算占空比
switch(ch)//选择pwm通道
{
case 1:
TIM_SetCompare1(TIMx,servo_temp);
break;
case 2:
TIM_SetCompare2(TIMx,servo_temp);
break;
case 3:
TIM_SetCompare3(TIMx,servo_temp);
break;
case 4:
TIM_SetCompare4(TIMx,servo_temp);
break;
}
//计算延迟时间
servo_temp=servo_angle-angle;
if(servo_temp<0)
servo_temp=-servo_temp;
servo_temp=servo_temp*3+10;

USART_SendNumber(USART1,angle);
delay_ms(servo_temp);

servo_angle=angle;

}


关键字:STM32F4  舵机控制 引用地址:基于STM32F4的舵机控制

上一篇:STM32-PWM波-控制舵机
下一篇:STM32控制舵机转动

推荐阅读最新更新时间:2024-03-16 16:05

STM32F4控制核心的四轴航拍飞行器的设计与实现
摘要 本设计是基于STM32F4的四轴航拍平台。以STM32F407为控制核心,四轴飞行器为载体,辅以云台的航拍系统。硬件上由飞控电路,电源管理,通信模块,动力系统,机架,云台伺服系统组成。算法上采用简洁稳定的四元数加互补滤波作为姿态解算算法,PID作为控制器,实现飞行,云台增稳等功能。具有灵活轻盈,延展性,适应性强好等特点。 引言 四轴飞行器是一种利用四个旋翼作为飞行引擎来进行空中飞行的飞行器。进入20世纪以来,电子技术飞速发展四轴飞行器开始走向小型化,并融入了人工智能,使其发展趋于无人机,智能机器人。 四轴飞行器不但实现了直升机的垂直升降的飞行性能,同时也在一定程度上降低了飞行器机械结构的设计难度。四轴飞行器的平
[单片机]
以<font color='red'>STM32F4</font>为<font color='red'>控制</font>核心的四轴航拍飞行器的设计与实现
测试STM32F4 EVNETOUT
看到很多管脚都可以配置成EVENTOUT,刚好有个管脚要想要输出一个高电平脉冲,测试了一下: 环境:STM32F407, IAR 7.4, STM32CubeF4 GPIO配置代码: GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF15_EVENTOUT; HAL_GPIO_Init(GPIOB
[单片机]
测试<font color='red'>STM32F4</font> EVNETOUT
STM32F4时钟配置
看了下时钟树按照http://blog.csdn.net/louyangyang91/article/details/51374924这个博文配置了,结果发现UART波特率不对,但是MOC1\2都是正常输出(168M/5分频输出),蒙了很久才发现 USART_Init(USART1, &USART_InitStructure); 这个函数内部会调用RCC_GetClocksFreq(&RCC_ClocksStatus);这个函数来得到PCLK1\PCLK2等系统时钟,进入这个函数看其内部发现它调用了一个HSE_VALUE的宏定义,继续定位发现居然是 #if !defined (HSE_VALUE) #define HSE_VA
[单片机]
STM32F4 串口程序 调试记录 hardfault_handle 问题
项目型号: Proj01_uart // 从现在起开始使用项目型号,此程序调试通过 /***************************************************************************** ** 使用UART4通信 ** TXD = PA0 ** RXD = PA1 ****************************************************************************** ** 乔海权 ** 14-04-03 *********************************************************
[单片机]
基于stm32f4的三维旋转显示平台
现实的世界是一个拥有宽度、高度和深度的三维立体世界。在平面二维显示技术已经成熟的今天,三维立体显示技术首当其冲的成为了当今显示技术领域的研究热点。 本作品搭建了基于stm32f4的三维旋转显示平台,它的显示原理属于三维显示中的体三维显示一类。它是通过适当方式来激励位于透明显示体内的物质,利用可见辐射光的产生三维体像素。当体积内许多方位的物质都被激励后,便能形成由许多分散的体像素在三维空间内构成三维图像。 体三维显示又称为真三维显示,因为他所呈现的图像在真实的三维空间中,展示一个最接近真实物体的立体画面,可同时允许多人,多角度裸眼观看场景,无序任何辅助眼镜。 本作品的特点在于,利用stm32f4的浮点运算能力,实现了低成本的体三维
[单片机]
基于<font color='red'>stm32f4</font>的三维旋转显示平台
STM32F407定时器TIM1中断
实验现象:LED灯0.5s闪烁 /**************************************************************************************** *函 数 名:bsp_Inittimer1 *函数功能:初始化定时器1 *形 参:无 *返 回 值:无 *****************************************************************************************/ void bsp_Inittimer1(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseIni
[单片机]
STM32控制16路舵机控制板PCA9685
介绍 PCA9685 是最新的快速模式 Plus(Fm+)系列中的一员。 Fm+器件可以提供更高的频率 (高达 1MHz)和更频繁(densely populated) 的总线操作(高达 4000pF)。 OE引脚一定要至低使能,或者直接接地 网上Arduino的教程很多,商家给的也是Arduino的驱动文件,那怎么在STM32上用呢? STM32与驱动板的连接 驱动板 STM32 VCC 3.3V GND GND SCL I2C_SCL SDA I2C_SDA OE GND(低电平) V+ 不接 V+可以不接而采用电源接线柱使用外部供电,用5V的充电宝即可 由于PCA9685是使用IIC的,那么如何使用I
[单片机]
STM32F4 定义ucosii到CCM
STM32F4说是有192KRAM 但是很是很坑。192k分为两部分128k普通RAM和64K CCM RAM,CCM只能内核调用,外设无法使用。本来想着192KRAM挺好,结果仔细看悲剧了。但是也不能浪费,可以尝试使用它,把UCOS内核数据放到CCM。网上搜索到一个FreeRTOS的照着他的自己弄了弄。 1.勾选IARM2 确认使用CCM 此时编译程序后打开.map文件会发现使用了CCM但是没有数据定义到这块RAM。同时发现IRAM1内部关于UCOS的存储。 2.打开.sct文件添加如下图代码--UCOS_ii_IARM自己写的,把刚刚在IRAM1中看到的 os_core.o 和os_cpu_c.o文件
[单片机]
<font color='red'>STM32F4</font> 定义ucosii到CCM
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved