历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2020年02月01日 | STM32驱动舵机

2020-02-01 来源:eefocus

舵机控制原理:


提供周期为20ms的pwm信号,调节pwm的占空比为0.5ms-2.5ms可使舵机从0-180度线性变化


舵机控制程序:


首先我们要利用stm32定时器产生合适周期的pwm输出信号,这里使用的是PWM高级定时器1的CH1(即PA8),可以通过配置输入参数arr和psc产生合适的频率的pwm脉冲信号。


//高级定时器1pwm输出初始化

//arr:自动重装值(周期)  psc:时钟预分频数

void tim1_pwmInit(uint16_t arr, uint16_t psc)

{

  GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能定时器1的外设时钟

  RCC_APB2PeriphClockCmd(TIM1_CH1_GPIO_CLK, ENABLE);  //使能GPIO外设时钟使能                               

 

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = TIM1_CH1_PIN; //TIM_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(TIM1_CH1_PORT, &GPIO_InitStructure);

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K

TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

//TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低

TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

 

  TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能

TIM_Cmd(TIM1, ENABLE);  //使能TIM1

}

在有了pwm信号源之后我们便可以根据舵机的控制原理构建舵机驱动函数了。


// 72M / (719 + 1) = 0.1M 故记一个数的时间为10us  定时周期:(1999 + 1) * 10us = 20ms

#define SERVO_TIM_ARR  1999

#define SERVO_TIM_PSC  719

void servo_init(void)

{

  tim1_pwmInit(SERVO_TIM_ARR,SERVO_TIM_PSC);

  TIM_SetCompare1(TIM1,150);  //使舵机恢复到中间位置

}

 

//0.5ms--0°  2.5ms--180°

void servo_angle(uint16_t angle)

{

  uint16_t pulse;

  

  //针对舵机可转角度限辐

  if(angle <= 5)

    angle = 5;

  if(angle >= 175)

    angle = 175;

  //将角度值转换为脉冲值  

  pulse = (uint16_t)(50 + angle * 100/90.0);  //此转换公式需根据pwm的arr及psc配置来做相应变化

  TIM_SetCompare1(TIM1, pulse);

  

}

 

void servo_debug(void)

{

  uint8_t i;

  for(i = 0; i < 10; ++i)

  {

    delay_ms(500);

    servo_angle(45);

    delay_ms(500);

    servo_angle(90);

    delay_ms(500);

    servo_angle(135);

    delay_ms(500);

    servo_angle(90);

  }

}


在主函数中初始化舵机驱动后,便可以调用servo_angle(uint16_t angle)函数实现舵机在5-175度之间任意角度的旋转,选择5-175度限辐是为了保护舵机(防止舵机处于打死的状态),也可改为0-180度。

推荐阅读

史海拾趣

DFI公司的发展小趣事

在稳固了国内市场地位后,DFI开始将目光投向全球市场。公司积极开拓北美、拉丁美洲和亚太地区的业务,通过参加国际展会、与当地企业建立合作关系等方式,不断提升品牌知名度和市场份额。同时,DFI还针对不同地区的市场需求,推出定制化的产品和服务,以满足客户的多样化需求。这一全球化战略使DFI在国际市场上取得了显著的成绩。

永丰盈(CST)公司的发展小趣事

深圳市永丰盈电子有限公司(CST)成立于2003年,初始阶段,公司只有几名员工和几台设备,专注于电子接插件产品的生产与销售。在创始人坚定的信念和团队不懈的努力下,CST逐步在市场上崭露头角。公司秉持“诚信、踏实、齐心、努力”的经营理念,通过严格的质量控制和持续的技术创新,赢得了客户的信任。

Fenghua (HK) Electronics Ltd公司的发展小趣事

Fenghua (HK) Electronics Ltd自成立以来,始终将技术创新作为企业发展的核心动力。公司投入大量研发资源,不断推出具有市场竞争力的新产品。其中,一款具有自主知识产权的智能家居控制系统,凭借其独特的智能化和便捷性,在市场上引起了广泛关注。公司通过与国内外知名科技企业的合作,不断引进先进技术和管理经验,提升了整体竞争力。

绿宝石(BERYL)公司的发展小趣事

绿宝石公司始终坚持品质至上的原则,对每一道生产工序都进行严格把控。公司引进了先进的生产设备和检测仪器,确保产品质量的稳定性和可靠性。此外,公司还建立了完善的售后服务体系,及时解决客户在使用过程中遇到的问题。凭借卓越的产品品质和优质的服务,绿宝石公司赢得了客户的广泛信赖和好评。

E-San Electronic Co Ltd公司的发展小趣事

在市场竞争日益激烈的情况下,E-San Electronic Co Ltd积极寻求市场拓展的新策略。公司通过与国内外知名企业的合作,成功进入了国际市场。同时,公司还加大了对新兴市场的开拓力度,通过参加各种国际展会和商务活动,提升了品牌知名度和影响力。此外,公司还积极探索线上线下相结合的销售模式,通过电商平台和社交媒体等新兴渠道拓展销售渠道。

厦门法拉(faratronic)公司的发展小趣事

在追求商业成功的同时,FMI公司也积极履行社会责任,致力于环保和可持续发展。公司制定了一系列环保计划和程序,以确保在所有业务运营中保持环保意识。FMI的产品从设计到生产都遵循环保原则,采用环保材料和工艺,减少对环境的影响。此外,公司还积极参与行业内的环保活动,推动整个电子行业的绿色发展。这种负责任的企业形象为FMI赢得了社会的广泛赞誉和尊重。

问答坊 | AI 解惑

机器人设计

哪里可以找到机器人相关的设计资料啊,关节机器人的…

查看全部问答>

紧急求助

刚开始做猎头,不知道去哪里发贴找人,请高人指点一下。 另外,那位同学是做中间件的,要跳槽跟我联系,邮箱:fanqi2009@gmail.com…

查看全部问答>

SfGetObjectName这个方法在哪个偷文件下?

如题目.我照别人写的驱动程序搬都出错,请问谁知道SfGetObjectName()这个方法在哪个头文件下…

查看全部问答>

ATmega8实现的电视字幕叠加器

  随着数字电视和VOD的推广和流行,这种基于硬件的字幕叠加器恐怕很快就要过时了,但是在某些场合或许还会有一定的应用,比方说跳舞毯等一些简单的设备。 这个叠加器非常简单,使用ATmega8作为CPU,外围电路使用了视频分离芯片LM1881简化了一 ...…

查看全部问答>

招聘FPGA工程师(北京至芯开源科技有限责任公司)

招聘FPGA工程师(北京至芯开源科技有限责任公司) 要求: 1、熟练掌握VHDL/Verilog语言,能够熟练使用FPGA开发工具;2、参与过完整的FPGA开发流程;3、具有FPGA验证的工作经验;4、熟悉FPGA验证流程,了解业界相关的FPGA验证技术;5、熟悉FPGA的 ...…

查看全部问答>

CL2小板子布线图

3D效果 顶层布线  …

查看全部问答>

关于8寸液晶屏背光驱动问题

各位论坛里的朋友,请教一个问题,见图:目前该部分电路图的背光不是很亮,感觉有点暗,该部分的PWM0的调制部分的电路不是很懂,试着更改了PWM信号的频率效果不明显,有那位朋友能够分析一下这部分电路,如果要调节背光部分的,该怎么去调,谢谢。 ...…

查看全部问答>

哪位大侠知道ucos2下LM3S8962中断相应的过程及响应的代码是哪块吗?

哪位大侠知道ucos2下LM3S8962中断响应的过程(进入中断服务程序之前)及相应的代码是哪块吗?我看了半天没弄明白。 如蒙赐教,不胜感激!…

查看全部问答>

本周四要去采访Altera CTO Misha Burich,现向广大版友征集采访问题

不知道各位大佬是否有关于FPGA未来,关于Altera的看法,关于Misha Burich本人,等等随便什么都可以抛过来。 欢迎拍砖,多谢多谢啦:) …

查看全部问答>

【转】高速PCB设计:源同步时钟系统 (上篇)

经过之前对共同时钟系统和内同步时钟系统的总结,可以发现建立时间的关系式和时钟频率,也就是Tcycle有关,同时由于工艺以及其他一些因素,Tco很难做到很小。随着频率的提升,共同时钟系统很快就遇到瓶颈,时序余量无法满足,在这种形势下,源同步 ...…

查看全部问答>