天天看點

STM32按鍵控制L298N驅動兩直流電機正反轉以及停止(有代碼)STM32按鍵控制L298N驅動兩直流電機正反轉以及停止

STM32按鍵控制L298N驅動兩直流電機正反轉以及停止

一、包括的部件

1.stm32f103zet6

2.l298n

3.電機

4.其他

二、硬體連接配接

缺鍵盤,直接用了整個開發闆…

沒有12V電源,用了升壓闆…

卑微…

然後就是…

L298N上:

1、OUT1、2接一個電機;3、4 接接一個電機。如果最後方向和你想的不一樣,1、2或者3、4反過來接電機上。

2、IN1、2、3、4分别接PA2、3、4、5

3、

12v端口的接電源正;

中間的GND,引出兩條線。一接闆子上GND(才能通訊),二接電源負

5v端口不接,不然很難轉動 !!!

4、闆子和升壓闆都上電。(隻有5v接口的卑微)

優化空間很大,各位看官發揮自己想象力。

STM32按鍵控制L298N驅動兩直流電機正反轉以及停止(有代碼)STM32按鍵控制L298N驅動兩直流電機正反轉以及停止
STM32按鍵控制L298N驅動兩直流電機正反轉以及停止(有代碼)STM32按鍵控制L298N驅動兩直流電機正反轉以及停止
STM32按鍵控制L298N驅動兩直流電機正反轉以及停止(有代碼)STM32按鍵控制L298N驅動兩直流電機正反轉以及停止

三、代碼部分

部分代碼

main.c

#include "stm32f10x.h"         //官方庫
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
 
#include "motor.h"
#include "delay.h"
#include "key.h"
 
 
int main(void)
{
	vu8 key=0;	
	Motor_12_Config(); //電機的初使化
	delay_init();  //延時函數初始化
	delay_ms(10000);
	KEY_Init();//按鍵初始化     
	
	while(1)
	{
	    key=KEY_Scan(0);	//得到鍵值
	   	if(key)
		{						   
			switch(key)
			{				 
				case WKUP_PRES:	   //電機正轉
					             	Motor_1_PRun(); //正轉
	                      Motor_2_PRun();
			                  delay_ms(1); 
					break; 
				
				case KEY1_PRES:	   //電機反轉 
					             Motor_1_NRun();  //反轉
                       Motor_2_NRun();
				               delay_ms(1); 
					break;
				case KEY0_PRES:    //電機停止
                          Motor_1_STOP();  //停止
                          Motor_2_STOP();	
				                  delay_ms(1); 
				break;
			}
		}else delay_ms(10); 
	}
}
           

motor.c

#include "motor.h"  //導入led頭檔案
#include "stm32f10x.h"  //導入STM32官方庫
#include "stm32f10x_rcc.h"  //導入STM32的RCC時鐘庫
#include "delay.h"       //延時庫
 
void Motor_12_Config(void)  //定義初始化函數
{
	GPIO_InitTypeDef GPIO_InitStructure;   //定義GPIO_InitTypeDef結構體
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);  //開啟引腳時鐘
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //定義IN引腳
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //設定輸出功率
	GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化GPIOA的引腳參數,寫進
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); //所有引腳拉低
}
 
void Motor_1_STOP(void)
{
	IN1(High);
	IN2(High);
}
 
void Motor_1_PRun(void)
{
	IN1(Low);
	IN2(High);
}
 
void Motor_1_NRun(void)
{
	IN1(High);
	IN2(Low);
}
 
void Motor_2_STOP(void)
{
	IN3(High);
	IN4(High);
}
 
void Motor_2_PRun(void)
{
	IN3(Low);
	IN4(High);
}
 
void Motor_2_NRun(void)
{
	IN3(High);
	IN4(Low);
}


           

motor.h

#ifndef __MOTOR1_H
#define __MOTOR1_H
 
 
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
 
#define High    1
#define Low     0
 
#define IN1(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_2);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_2)
 
#define IN2(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_3);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_3)
 
#define IN3(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_4);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_4)
 
#define IN4(a) if (a)  \
	GPIO_SetBits(GPIOA,GPIO_Pin_5);\
else  \
	GPIO_ResetBits(GPIOA,GPIO_Pin_5)
 
void Motor_12_Config(void);
 
void Motor_1_STOP(void);
void Motor_1_PRun(void);
void Motor_1_NRun(void);
 
void Motor_2_STOP(void);
void Motor_2_PRun(void);
void Motor_2_NRun(void);
 
#endif

           

key.c

void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE時鐘

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設定成上拉輸入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3

	//初始化 WK_UP-->GPIOA.0	  下拉輸入
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設定成輸入,預設下拉	  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

}
//按鍵處理函數
//傳回按鍵值
//mode:0,不支援連續按;1,支援連續按;
//0,沒有任何按鍵按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 WK_UP
//注意此函數有響應優先級,KEY0>KEY1>KEY_UP!!
u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按鍵按松開标志
	if(mode)key_up=1;  //支援連按		  
	if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
	{
		delay_ms(10);//去抖動 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; 	    
 	return 0;// 無按鍵按下
}


           

key.h

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"
#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//讀取按鍵0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//讀取按鍵1
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//讀取按鍵3(WK_UP) 
#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define WKUP_PRES   3	//KEY_UP按下(即WK_UP/KEY_UP)


void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8);  	//按鍵掃描函數					    
#endif

           

代碼源檔案見首頁下載下傳資源

如果有正點原子的官方庫,在裡面找一個具有以下這些配置的工程。把幾個檔案添加進去就可。

STM32按鍵控制L298N驅動兩直流電機正反轉以及停止(有代碼)STM32按鍵控制L298N驅動兩直流電機正反轉以及停止
STM32按鍵控制L298N驅動兩直流電機正反轉以及停止(有代碼)STM32按鍵控制L298N驅動兩直流電機正反轉以及停止

繼續閱讀