1回答

1收藏

玩GD32F450那些事之舵机

GD32 GD32 5758 人阅读 | 1 人回复 | 2017-06-18

玩GD32F450那些事之光耦+舵机

一、前言
          早些日子分享了GD32F450半自动相机方案,不知啥情况几天了一直都在审核中,工作人员也没有答复,擦擦!搞得心情不爽,不过咱们不管他们了,不要让这不愉快的事情影响到我们学习分享的步伐。这次我首先要分享的是我在舵机驱动中干得那些坑爹的事。
        其实干下这些事都是,自己在瞎搞搞,总感觉驱动金属舵机需要提供给个大的驱动电流,最后导致烧了舵机,烧了小红板上的USB模块芯片。

1.1金属舵机         1.2普通塑料舵机

二、干的那些事
1、S8050驱动舵机
     S8050各肯定用得特别的多,我也开始就想到了用这个来搞。

图1.3NPN管驱动

     如上图所示,设计的时候,我是想保证这个输出电平幅值是0-5V,管子工作在饱和状态,GD32F450的输出电压是0-3.3V,这样化,R2=47K,R1=200R, 当Vin=3.3V 时Ib=0.07mA, Ic=21mA, 此时Vout=0V ,当Vin=0V时,Vout=5V。
2、S8550驱动舵机
     对于PNP管来驱动,我们经常用来驱动蜂鸣器,当然不是下面这种搞法,下面这种形式是我前面在做板子的时候,将以封装搞错了,实在没辙将本应该焊接NPN的换成了PNP在1,2脚直接悬空焊接了一个电阻就得到了下图了。

图1.4PNP管驱动

      如上图所示,3.3V时输出0V,0V时输出5V
3、开漏输出驱动舵机
     当然对于单片机引脚没法输出5V时,我们还有一个常用的就是开漏输出并上拉5V啦。

图1.5上拉5V

4、光耦驱动
      搞到光耦,也是当我用上面的开漏输出去驱动两个金属舵机时,舵机动了几下忽然发现一缕青烟,从此这个GL850就退休了。

图1.7 退休的GL850

冒了烟,要我认识到,保护还是很重要的,所以选择了下面的光耦驱动,将电源隔离了,外接6V电源给舵机供电。

图1.7 光耦驱动

小测了输出波形,这波形还是不错的,怎么说我也不担心烧小红板了。

图1.8输入输出波形

个人总结下:使用前面三种方法输出波形1和3还是挺好的,唯独2幅值达到了,但是擦擦有相当大的干扰,干扰原因不详,反正最后舵机烧了,使用方案1时,也是坑,不知当时是电机已经烧了还是怎么,幅值会被拉低。方案3,那就呵呵呵,两个舵机以上GL850冒烟了。有大神精通请指导一二。
三、舵机
       1)、常用舵机的额定工作电压为6V,可以使用LM1117等芯片提供6V的电压,如果为了简化硬件上的设计直接使用5V的供电影响也不是很大,但最好和单片机进行分开供电,否则会造成单片机无法正常工作。
       2)、一般来说可以将来信号线连接至单片机的任意引脚,对于51单片机需通过定时器模块出PWM才能进行控制。但是如果连接像飞思卡尔之类的芯片,由于飞思卡尔内部带有PWM模块,可以直接输出PWM信号,此时应将来信号连于专用的PWM输出引脚上。

      
图1.9脉冲与角度对应图

四、代码
        我们这是是定时器产生两路PWM来控制舵机。
1、引脚配置
  1. void SG_gpio_config(void)
  2. {
  3.     rcu_periph_clock_enable(RCU_GPIOA);
  4.    
  5.     /*Configure PA1 PA2 (TIMER1 CH1 CH2) as alternate function*/
  6.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
  7.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);

  8.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);
  9.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2);

  10.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_1);
  11.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);
  12. }
复制代码
2、定时器配置
  1. void timer_config(void)
  2. {
  3.     /* -----------------------------------------------------------------------
  4.     TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles:
  5.     TIMER1CLK = SystemCoreClock / 120 = 1MHz

  6.     TIMER1 channel1 duty cycle = (4000/ 20000)* 100  = 25%
  7.     TIMER1 channel2 duty cycle = (8000/ 20000)* 100  = 50%

  8.     ----------------------------------------------------------------------- */
  9.     timer_oc_parameter_struct timer_ocintpara;
  10.     timer_parameter_struct timer_initpara;

  11.     rcu_periph_clock_enable(RCU_TIMER1);
  12.     rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);

  13.     timer_deinit(TIMER1);

  14.     /* TIMER1 configuration */
  15.     timer_initpara.prescaler         = 119;
  16.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  17.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  18.     timer_initpara.period            = 19999;               //?è????20ms
  19.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  20.     timer_initpara.repetitioncounter = 0;
  21.     timer_init(TIMER1,&timer_initpara);

  22.     /* CH1,CH2 configuration in PWM mode1 */
  23.     timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
  24.     timer_ocintpara.outputstate = TIMER_CCX_ENABLE;

  25.     timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);
  26.     timer_channel_output_config(TIMER1,TIMER_CH_2,&timer_ocintpara);

  27.     /* CH1 configuration in PWM mode1,duty cycle --% */
  28.     timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,1000);
  29.     timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
  30.     timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);

  31.     /* CH2 configuration in PWM mode1,duty cycle --% */
  32.     timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,1000);
  33.     timer_channel_output_mode_config(TIMER1,TIMER_CH_2,TIMER_OC_MODE_PWM0);
  34.     timer_channel_output_shadow_config(TIMER1,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);


  35.     /* auto-reload preload enable */
  36.     timer_auto_reload_shadow_enable(TIMER1);
  37.     /* auto-reload preload enable */
  38.     timer_enable(TIMER1);
  39. }
复制代码
五、实物图
         大家会疑惑怎么晒出来的是两塑料舵机,主要是考虑大家可能用塑料舵机比较多。

图1.10 双舵机实物图




timg.jpg (45.75 KB, 下载次数: 126)

timg.jpg

timg1.jpg (20.51 KB, 下载次数: 144)

timg1.jpg

u=2702951942,3128271255&fm=26&gp=0.jpg (5.06 KB, 下载次数: 135)

u=2702951942,3128271255&fm=26&gp=0.jpg

XJ0$Z3ZQT{ZC~_0M{L[652P.png (94.49 KB, 下载次数: 123)

XJ0$Z3ZQT{ZC~_0M{L[652P.png

)@U`XIBOQ1@$TH}8O8O{[B4.png (83.09 KB, 下载次数: 127)

)@U`XIBOQ1@$TH}8O8O{[B4.png
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

wendesy

发表于 2018-1-13 15:32:50 | 只看该作者

感谢分享!!!!!!!!!!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条