收藏官网首页
查看: 17896|回复: 1

直流小电机驱动

321

主题

1054

帖子

4513

积分

论坛元老

Rank: 8Rank: 8

积分
4513
QQ
跳转到指定楼层
楼主
发表于 2017-5-11 21:47:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
本帖最后由 bigfanofloT 于 2017-5-16 19:42 编辑

一、直流小电机及其驱动L9110介绍
gokit板载一个直流小电机,通过L9110来驱动。L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片IC之中,使**器件成本降低,整机可靠性提高。该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过800mA的持续电流,峰值电流能力可达1.5A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。L9110被广泛应用于玩具汽车电机驱动、脉冲电磁阀门驱动,步进电机驱动和开关功率管等电路上。


低静态工作电流;宽电源电压范围:2.5V-12V;
每通道具有800mA连续电流输出能力;
较低的饱和压降;
输出具有正转、反转、高阻和刹车四种 状态;
TTL/CMOS 输出电平兼容,可直接连 CPU;  
输出内置钳位二极管,适用于感性负 载;  
控制和驱动集成于单片IC之中;
具备管脚高压保护功能;
工作温度:-20℃-80℃  

二、硬件连线
对于gokit V2.3扩展板,板载L9110的A路输入管脚IA连接到了arduino UNO接口的D5,B路输入管脚IB连接到了arduino UNO接口的D4,通过控制D4和D5输出PWM信号即可实现控制电机转动方向和速度,如图1所示:

图1 Gokit V2.3扩展板L9110原理图
根据Nucleo-F767ZI的原理图,图2可以知道,STM32F767ZIT6的GPIO PE11连接到了Arduino UNO接口的D5,且具备PWM输出功能,为定时器1的通道2,PF14连接到了Arduino UNO接口的D4,不具备PWM功能,因此本次只能驱动电机单向转动。

图2 Nucleo-F767ZI的Arduino UNO接口原理图
三、完整程序
如下Hal_motor.h文件,十分方便移植到其它MCU:

  1. #ifndef _HAL_MOTOR_H
  2. #define _HAL_MOTOR_H

  3. #include <stdio.h>
  4. #include "stm32f7xx_hal.h"
  5. #include "stm32f7xx_hal_tim.h"


  6. #define Motor_stop        0
  7. #define Motor_Forward     1
  8. #define Motor_Reverse     2


  9. #define MOTOR_ARR 899 //8kHZ
  10. #define MOTOR_MAX 100
  11. #define MOTOR_MAX1 -100
  12. #define MOTOR_MIN 0

  13. #ifdef  MOTOR_16
  14. typedef int16_t motor_t;
  15. #else
  16. typedef int8_t motor_t;
  17. #endif

  18. void motorInit(void);
  19. void motorStatus(motor_t status);

  20. #endif /*_HAL_MOTOR_H*/
复制代码
如下为Hal_motor.c文件:
  1. /**
  2. ************
  3. *
  4. * @file      Hal_motor.c
  5. * @author    Gizwtis
  6. * @version   V03010100
  7. * @date      2016-07-05
  8. *
  9. * @brief     机智云.只为智能硬件而生
  10. *            Gizwits Smart Cloud  for Smart Products
  11. *            链接|增值ֵ|开放|中立|安全|自有|自由|生态
  12. *            www.gizwits.com
  13. *
  14. ************/
  15. #include <math.h>
  16. #include "Hal_motor.h"


  17. TIM_HandleTypeDef TIM1_Handler;         //¶¨Ê±Æ÷¾ä±ú

  18. void TIM1_PWM_Init(void)
  19. {
  20.           TIM_MasterConfigTypeDef sMasterConfig;
  21.           GPIO_InitTypeDef GPIO_Initure;
  22.     TIM_OC_InitTypeDef TIM1_CH2Handler;     //¶¨Ê±Æ÷3ͨµÀ4¾ä±ú
  23.         
  24.     TIM1_Handler.Instance=TIM1;            //¶¨Ê±Æ÷3
  25.                 TIM1_Handler.Channel=HAL_TIM_ACTIVE_CHANNEL_2;        
  26.     TIM1_Handler.Init.Prescaler=9;       //¶¨Ê±Æ÷·ÖƵ
  27.     TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//ÏòÉϼÆÊýģʽ
  28.     TIM1_Handler.Init.Period=21600;          //×Ô¶¯ÖØ×°ÔØÖµ
  29.     TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  30.           TIM1_Handler.Init.RepetitionCounter=0;        
  31.     HAL_TIM_PWM_Init(&TIM1_Handler);       //³õʼ»¯PWM
  32.    
  33.         sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  34.   sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  35.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  36.   if (HAL_TIMEx_MasterConfigSynchronization(&TIM1_Handler, &sMasterConfig) != HAL_OK)
  37.   {

  38.   }
  39.         
  40.     TIM1_CH2Handler.OCMode=TIM_OCMODE_PWM1; //ģʽѡÔñPWM1
  41.     TIM1_CH2Handler.Pulse=21600/2;            //ÉèÖñȽÏÖµ,´ËÖµÓÃÀ´È·¶¨Õ¼¿Õ±È£¬                                            //ĬÈϱȽÏֵΪ×Ô¶¯ÖØ×°ÔØÖµµÄÒ»°ë,¼´Õ¼¿Õ±ÈΪ50%
  42.     TIM1_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //Êä³ö±È½Ï¼«ÐÔΪµÍ
  43.            
  44.           __HAL_RCC_TIM1_CLK_ENABLE();                        //ʹÄܶ¨Ê±Æ÷3
  45.                
  46.     __HAL_RCC_GPIOE_CLK_ENABLE();                        //¿ªÆôGPIOBʱÖÓ
  47.     GPIO_Initure.Pin=GPIO_PIN_11;                   //PB1
  48.     GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //¸´ÓÃÍÆÍêÊä³ö
  49.     GPIO_Initure.Pull=GPIO_PULLUP;          //ÉÏÀ­
  50.     GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //¸ßËÙ
  51.           GPIO_Initure.Alternate=GPIO_AF1_TIM1;        //PB1¸´ÓÃΪTIM3_CH4
  52.     HAL_GPIO_Init(GPIOE,&GPIO_Initure);
  53.                
  54.           HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH2Handler,TIM_CHANNEL_2);//ÅäÖÃTIM3ͨµÀ4
  55.    
  56.     HAL_TIM_PWM_Stop(&TIM1_Handler, TIM_CHANNEL_2);
  57. }



  58. void motorInit(void)
  59. {
  60.     TIM1_PWM_Init();        
  61.           TIM1->CCR2 = 0;

  62. }


  63. void motorControl(uint8_t m1,uint8_t m2)
  64. {
  65.                         uint16_t temp = (MOTOR_ARR+1) / MOTOR_MAX;
  66.                                 
  67.                   TIM1->CCR2 = m1*temp;
  68. }

  69. void motorStatus(motor_t status)
  70. {
  71.     if(0 == status)
  72.     {
  73.                           HAL_TIM_PWM_Stop(&TIM1_Handler, TIM_CHANNEL_2);
  74.         motorControl(0,0);
  75.     }
  76.     else
  77.     {
  78.                           HAL_TIM_PWM_Start(&TIM1_Handler, TIM_CHANNEL_2);
  79.         if(status > 0)
  80.         {
  81.             motorControl((abs(status)+5)*10, 0);
  82.         }
  83.         else
  84.         {
  85.             motorControl(0, (abs(status)+5)*10);
  86.         }
  87.     }  
  88. }

复制代码

本系列帖子目录:
http://club.gizwits.com/thread-6544-1-1.html




1、机智云QQ群:G1群:104975951 G2群:491509598 G3群:287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits、 机智云智能宠物屋go-iot
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表