TC118S+STM32F103使用PWM驱动电机

目录

TC118S简介:

电路参考应用:

芯片使用:

STM32代码实现:

PWM初始化函数:

引脚输出电平函数:

TC118S.h文件相关宏定义与函数声明:

主函数main.c:  

 接线:

结尾


TC118S简介:

    TC118S单通道直流正反转马达驱动器,是一颗单通道内置功率MOS全桥驱动芯片,适用于电动牙刷,玩具马达驱动,电子锁,电动茶具等
    TC118S是一颗单通道内置功率MOS全桥驱动芯片,有驱动前进、后退、停止及刹车功,有内置迟滞热效应过流保护功,低导通电阻(1.6Ω),最大连续输出电流可达 1.8A峰值 2.5A ,无需外围滤波电容。

电路参考应用:

注:在不同的应用中,C1、C2 可考虑只装一个:在 3V 应用中建议用一个 1uF 或以上;在 4.5V 应用中建议用一 个 4.7uF 或以上,均为使用贴片电容;在 6V 应用中建议用一个大电容 220uF+100nF 贴片电容;C2 均靠近 IC 之 VDD 管脚放置且电容的负极和 IC 的 GND 端之间的连线也需尽量短。即不要电容虽然近,但布线、走 线却绕得很远(参考下图)。当应用板上有大电容在为其它芯片滤波时且离 TC118S 较远也需按如上要求再 放置一个小电容于 TC118S 的 VDD 脚上。图中 C4(100nF)电容优先接于马达上,当马达上不方便焊此电 容时,则将其置于 PCB 上。

        这款驱动芯片的电平逻辑与一般的驱动芯片有些许不同,是双通道输入驱动器,分为INA和INB,接错了会导致电机转动异常或反向转动。INA和INB为一高一低,即只有当INA=1&INB=0或INA=0&INB=1时,电机才能够正常的正转反转。当INA和INB均为1,即高电平时,电机则进行刹车(停止)。

具体输入/输出逻辑表和波形图如下图所示:


                                                       以上资料均来自于TC118S(富满)官方数据手册,仅供参考。

芯片使用:

        由于该芯片的电平逻辑与一般的驱动芯片有所不同,导致我在第一次使用这款芯片时,以一般驱动芯片的电平逻辑去进行使用,所以电机的转动无法按照预期一样,最终也是排查了一段时间才发现问题。在我上网查询了相关资料后,发现关于这款驱动芯片的说明比较少,但是又不希望使用这款芯片的朋友出现跟我一样的问题,所以写了这篇文章来进行分享。

        以下为使用STM32F103对TC118S的代码实现参考,因为我画的TC118S驱动芯片电路跟参考电路是一样的,就不放出来了。具体芯片电路应用参考上文,这里我们仅对INA和INB进行操作。

STM32代码实现:

        相关源码可在顶部自行下载

        这里我们使用的是STM32F103C8T6进行演示,函数使用标准库的函数。通过使用PWM与一个电平引脚进行电机控制,将PWM输出到驱动芯片的INA,电平则输出到INB。

  PWM初始化函数:

        这里的函数是对定时器初始化并输出一个高极性的PWM。用到的是TIM3的通道1,对应F103芯片的PA6引脚(这里的引脚在头文件写成了宏定义,方便用户自行修改,头文件会在下文给出)。

#include "stm32f10x.h"
#include "TC118S.h"

/******************************************************************
 * 函 数 名 称:TC118S_Init
 * 函 数 说 明:PWM配置
 * 函 数 形 参: pre定时器时钟预分频值    per周期
 * 函 数 返 回:无
 * 作       者:WW
 * 备       注:TIM3 为72MHz
******************************************************************/
void TC118S_Init(uint16_t pre,uint16_t per)
{
      GPIO_InitTypeDef                 GPIO_InitStructure;
      TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;
      TIM_OCInitTypeDef                TIM_OCInitStructure;

      RCC_APB1PeriphClockCmd(RCC_IN_TIMER,ENABLE);  //使能定时器3时钟
      RCC_APB2PeriphClockCmd(RCC_GPIO,ENABLE);      //使能GPIO外设

      //设置该引脚为复用输出功能
      GPIO_InitStructure.GPIO_Pin = GPIO_INA;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(PORT_GPIO, &GPIO_InitStructure);//初始化GPIO

      //初始化TIM
      TIM_TimeBaseStructure.TIM_Period = per - 1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
      TIM_TimeBaseStructure.TIM_Prescaler =pre - 1; //设置用来作为TIMx时钟频率除数的预分频值
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
      TIM_TimeBaseInit(IN_TIMER, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

      //初始化TIM Channel PWM模式
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性

      TIM_OC1Init(IN_TIMER, &TIM_OCInitStructure);  //初始化外设TIM

      TIM_OC1PreloadConfig(IN_TIMER, TIM_OCPreload_Enable);  //CCR1上的预装载寄存器

      TIM_Cmd(IN_TIMER, ENABLE);  //使能TIM3
}
引脚输出电平函数:

        这里使用一个IO引脚模拟高低电平的输出,前面提到的该款驱动芯片的逻辑电平与常识有点不同INA和INB为一高一低,即只有当INA=1&INB=0或INA=0&INB=1时,电机才能够正常的正转反转。所以当我们的PWM为高极性时,那么另一引脚则必须为低电平。反之PWM为低极性时,那么另一引脚则必须为高电平。上面我们的PWM为高极性,则这里使用PA7引脚输出一个低电平(同样写成宏定义)。

/******************************************************************
 * 函 数 名 称:INB_Init
 * 函 数 说 明:输出电平引脚配置
 * 函 数 返 回:无
 * 作       者:WW
 * 备       注:在初始化完成后输出了一个低电平
******************************************************************/
void INB_Init(void)
{
      GPIO_InitTypeDef  GPIO_InitStruct;
    
      RCC_APB2PeriphClockCmd(RCC_GPIO,ENABLE);
        
      GPIO_InitStruct.GPIO_Pin    =   GPIO_INB;
      GPIO_InitStruct.GPIO_Mode   =   GPIO_Mode_Out_PP;
      GPIO_InitStruct.GPIO_Speed  =   GPIO_Speed_50MHz;
        
      GPIO_Init(PORT_GPIO , &GPIO_InitStruct);
      
      GPIO_ResetBits(GPIOA, GPIO_INB);//输出低电平
}


                                                                              以上代码均存包含在自行创建的TC118S.c文件中

TC118S.h文件相关宏定义与函数声明:

        用户可根据情况自行修改相关的宏

#ifndef _TC1118S_H
#define _TC1118S_H

#include "stm32f10x.h"

#define RCC_GPIO                RCC_APB2Periph_GPIOA
#define PORT_GPIO               GPIOA

#define GPIO_INA                GPIO_Pin_6

#define GPIO_INB                GPIO_Pin_7

#define RCC_IN_TIMER            RCC_APB1Periph_TIM3
#define IN_TIMER                TIM3                // 定时器

void TC118S_Init(uint16_t pre,uint16_t per);
void AO_Control(uint8_t dir, uint32_t speed);
void INB_Init(void);

#endif  
主函数main.c:  
#include "stm32f10x.h"
#include "TC118S.h"

int main(void)
{

      INB_Init();
      TC118S_Init(72,1000);
      TIM_SetCompare1(IN_TIMER, 1000);
    
      while(1)
      {
        
      }

}

        以上所有相关代码均进行过测试,能够正常使用STM32F103C8T6结合TC118S对电机进行驱动以及控制。

        STM32相关代码到这里就完了,用户可自行使用参考代码进行相关测试,这里的代码仅演示芯片驱动电机正转,对于电机的反转这里就不演示了,可自行根据上文逻辑表修改代码的相关参数与内容进行实现。要停止电机转动的话,只需将INA和INB都设置为高电平(高极性)就可以了。

 接线:

这里的接线顺序仅针对上面的代码,STM32F103的PA6接在TC118S芯片的INA,PA7接在TC118S芯片的INB。TC118S的OUTA接在电机的任意一端,OUTB则接在电机的另一端,用户自行选择。


结尾

        希望这篇文章能给各位带来帮助,本人也是一名嵌入式学习者,文章如有错误或不当的地方,仅请指出。


                                                                                          注:制作不易,转载请注明出处!谢谢!

作者:WW想学嵌入式

物联沃分享整理
物联沃-IOTWORD物联网 » TC118S+STM32F103使用PWM驱动电机

发表回复