NB6612電機驅動與C8T6連線配置雙電機

mipaluna發表於2020-10-26

個人總結,如有不對,歡迎指正;
在這裡插入圖片描述
在這裡插入圖片描述
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
	}	 
 }

好,到此結束,接下來我們終於可以看的電機的轉動了!!

相關文章