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想学嵌入式