目录
简介
直流减速电机在很多智能化、自动化项目里常有用到,在一般项目里一般不用太精确,比如要编码什么的,我们要求就是驱动即可,通过pwm+pid控制它的速度,正反转就够了。现在需求是运输东西到一定位置。我们可以选最简单的直流减速电机两脚即可,如图1所示。
图1
在编程工程中,之前在stm32驱动的时候,没有加驱动直接芯片引脚给PWM也可以动,用来调试嘛。但是我在合泰板子调试的时候,我暂时没用驱动去搞,然后就一直驱动不了,主要用电表看pwm给芯片满值是3.3V,我觉得奇怪,但是直接板子3.3它可以动,然后看电路知道原来是它芯片输出引脚的驱动能力不足以提供足够的电流给电机,导致电机无法运转,就是电流保护嘛,输出电流小。然后我就使用了驱动电机芯片TB6612图2所示,用法功能如图3所示。
图2
图3
下面代码部分,本代码就是直接通过pwm控制速度没有实现正反转驱动一个减速电机,正反转实现也很简单,如果有需求自己可以试试。
DC_Motor.c
#include "DC_Motor.h"
void DCMotor_Init(void)
{
{ /* Enable peripheral clock
*/
CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
CKCUClock.Bit.PA = 1; //PA端口时钟开启
CKCUClock.Bit.PB = 1;
CKCUClock.Bit.GPTM0 = 1; //通用定时器GPTM0时钟开启
CKCUClock.Bit.AFIO = 1; //复用功能时钟开启
CKCU_PeripClockConfig(CKCUClock, ENABLE);
}
{ /* Configure AFIO mode as TM function
*/
AFIO_GPxConfig(GPIO_PA, AFIO_PIN_6, AFIO_MODE_4); //将GPTM0_CH2映射到PA6
GPIO_DirectionConfig(HT_GPIOA,GPIO_PIN_6, GPIO_DIR_OUT);
}
{ /* Time base configuration
*/
TM_TimeBaseInitTypeDef TimeBaseInit;
TimeBaseInit.Prescaler = 72 - 1; //Timer Clock = CK_AHB/HTCFG_PWM_TM_PRESCALER
TimeBaseInit.CounterReload = 101 - 1;
TimeBaseInit.RepetitionCounter = 0;
TimeBaseInit.CounterMode = TM_CNT_MODE_UP; //设置为向上计数
TimeBaseInit.PSCReloadTime = TM_PSC_RLD_IMMEDIATE; //立即重装载
TM_TimeBaseInit(HT_GPTM0, &TimeBaseInit);
TM_CRRPreloadCmd(HT_GPTM0, ENABLE); //使能CRR寄存器预装载值
TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);
}
{
//输入捕获配置
TM_OutputInitTypeDef OutInit;
OutInit.Channel = TM_CH_2;
OutInit.OutputMode = TM_OM_PWM1; //模式设置为PWM1,不同的模式可以查看数据手册
OutInit.Control = TM_CHCTL_ENABLE; //GPTM通道使能
OutInit.ControlN = TM_CHCTL_DISABLE;
OutInit.Polarity = TM_CHP_INVERTED; //GPTM通道极性为高电平有效
TM_OutputModeConfig(HT_GPTM0, TM_CH_2, TM_OM_PWM1);
//TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,0);
TM_OutputInit(HT_GPTM0,&OutInit);
}
//TM_IntConfig(HT_GPTM0, TM_INT_CH2CC, ENABLE); //中断
TM_Cmd(HT_GPTM0, ENABLE); //最后一定要记得使能GPTM
}
//电机pwm输入控制
void DCmotor_run(uint16_t PWM)
{
TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,PWM);
}
DC_Motor.h
#ifndef _DC_MOTOR_H
#define _DC_MOTER_H
#include "ht32f5xxxx_01.h" // Device header
void DCMotor_Init(void);
void DCmotor_run(uint16_t PWM);
#endif
main.c
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "USART.h"
#include "IIC.h"
#include "SHT30.h"
#include "modbus485.h"
#include "motor.h"
#include "DC_Motor.h"
//#include "Timer.h"
int temp1;
u16 humi;
volatile u32 milliseconds = 0;
volatile u32 seconds = 0;
u8 led_flag,light_in;
//
int main()
{
//USART1_Configuration();
//PWM_Init();
DCMotor_Init();
//LED_Init();
//SHT30_Init();
//BFTM0_Configuration();
//USART0_Configuration();
//USART_Configuration();
//Send_Data();
while(1)
{
//Motor1_up();
//Motor1_down();
DCmotor_run(50);
// Readshuju();
// delay_ms(1000);
}
}