NB6612电机驱动与C8T6连接配置双电机

个人总结,如有不对,欢迎指正;
在这里插入图片描述
在这里插入图片描述
NB6612电机驱动可以同时驱动两个直流电机。
一、电机引脚连接要求
1、STBY口接单片机的IO口拉低电机全部停止,置1(拉高)通过AIN1 AIN2,BIN1,BIN2 来控制正反转。
“需要电机转动时需要给其一个高电平”
2、VM 接12V以内电源 (2.74-10.8V)
3、VCC 接5V电源“供电后电机才会转”
4、3个GND 接一个电源负极即可
5、PWMA/B 接单片机的PWM口
6、AIN1/2 ,接单片机IO口, 驱动电机需要一个拉高(输入高电平),一个拉低(输入低电平)
BIN1/2 ,同AIN1/2
输入真值表
|A/B IN1 | 0 |

A/B IN1001
A/B IN2010
停止正转反转

7、A01 、AO2 接电机1的两个脚
B01、BO2 接电机2的两个脚
二、使用STM32F103C8T6如何连接电机驱动使两个电机转动
VM–>5v STBY–>3.3v VCC–>3.3v
PWMA–>IO口“配置了该IO口的定时器通道来配置PWM”
PWMB–>IO口“配置了该IO口的定时器通道来配置PWM”
AIN1–>IO口1“配置高或低”
AIN2–>IO口2“可先配置与AIN1相反,使电机转动,检查模块和电机是否正常,若想实现其他情况,按照上方真值表配置参数”
BIN1–>IO口3“配置高或低”
BIN2–>IO口4“可先配置与AIN1相反,使电机转动,检查模块和电机是否正常,若想实现其他情况,按照上方真值表配置参数”
GND–>GND
A01 、AO2 --> 接电机1的两个脚
B01、BO2 --> 接电机2的两个脚

timer.h

#ifndef __TIMER_H
#define __TIMER_H



#include "sys.h"

void TIM4_PWM_Init(u16 arr,u16 psc);
void PWM3_Init(u16 arr,u16 psc);
void LED_Init(void);//初始化



#endif


这里配置定时器通道,我选择了配置两个定时器的不同通道。存在的问题:我配置一个定时器的两个通道,驱动两个电机时,只有一个可以转。“找到解决方法后在此处改正”
timer.c

#include "pwm.h"
#include "led.h"

//TIM4 PWM部分初始化 
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
	//**结构体声明**//
	GPIO_InitTypeDef GPIO_InitStructure;            //声明GPIO
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //声明定时器
	TIM_OCInitTypeDef  TIM_OCInitStructure;         //声明PWM通道
	
	//**时钟使能**//
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	//使能定时器TIM4时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟
	
	//****//
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;				 //LED0-->PB.7 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 		 //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.7
	GPIO_SetBits(GPIOB,GPIO_Pin_7);

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

	
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2


	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4_CH2预装载寄存器
   
	TIM_Cmd(TIM4, ENABLE);  //使能TIM3
	
}
 
void PWM3_Init(u16 arr,u16 psc)  //TIM3的pwm设置和相应的引脚设置
{
 
	GPIO_InitTypeDef GPIO_InitStructure;
	
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    // 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
	//设置该引脚为复用输出功能,输出TIM3 CH1 的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   //TIM_CH1 //TIM_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOA, &GPIO_InitStructure);

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


	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;      //选择定时器模式:TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);               //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);               //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

	TIM_CtrlPWMOutputs(TIM3,ENABLE);	                  //MOE 主输出使能	

	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);     //CH1预装载使能	 
   //CH4预装载使能	 

	TIM_ARRPreloadConfig(TIM3, ENABLE);                   //使能TIMx在ARR上的预装载寄存器

	TIM_Cmd(TIM3, ENABLE);   
}



我这里的设置的PWM通道为定时器4通道2和定时器3通道1,PWMA和PWMB分别和PB7和PA6连接。
三、如何配置定时器
“输出PWM是属于IO口的复用功能,所以在设置GPIO_Mode的时候一定要设置为GPIO_Mode_AF_PP也就是推挽复用。”

在这里插入图片描述
在这里插入图片描述
PWM输出配置步骤
1.使能定时器和相关IO口时钟
2.初始化IO口为复用功能输出e.g.GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
3.若把IO口作定时器的PWM输出引脚,故需要重映射配置,故需要开启AFIO时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

4.初始化定时器:ARR,PSC等
5.初始化输出比较参数
6.使能预装载寄存器`

TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)`

7.使能定时器 TIM_Cmd();
8.不断改变比较值,来实现不同占空比的效果
配置定时器通道

 GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
	                                                                     	

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

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

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 
	
	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1

main.c

#include "delay.h"
#include "sys.h"
#include "pwm.h"



 int main(void)
 {		
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 	TIM4_PWM_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
	PWM3_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
	 LED_Init();
   	while(1)
	{	
		TIM_SetCompare1(TIM3,150);		//TIM4->CCR1=400					 
		TIM_SetCompare2(TIM4,150);	    //TIM4->CCR2=800
	}	 
 }

好,到此结束,接下来我们终于可以看的电机的转动了!!

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页