小车.电机方面理论

驱动电机

L298N电机驱动
PWM四种模式
采用L298N为电机驱动芯片
可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载
该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机,并联时可以驱动四台电机
在这里插入图片描述在这里插入图片描述

由图L298N芯片的原理图,引脚A,B可用于输入PWM脉宽调制信号对电机进行调速控制。如果无须调速可将两引脚接5V,使电机工作在最高速状态,既将短接帽短接。假设驱动的两台直流电机分别为M1和M2,当输入信号端IN1接高电平输入端IN2接低电平时,电机M1正转当信号端IN1接低电平,IN2接高电平,电机M1反转。控制另一台电机是同样的方式,输入信号端IN3接高电平,输入端IN4接低电平,电机M2正转(反之则反转)。PWM信号端A控制M1调速,PWM信号端B控制M2调速 。可通过单片机IO口状态来控制小车运行,电机具体运行方式如图
EnA控制1和2,ENB控制3和4
在这里插入图片描述在这里插入图片描述

mos双驱动板

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922092518455.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1bmRk在这里插入图片描述
dW4=,size_16,color_FFFFFF,t_70#pic_center)

dianji.h文件

#ifndef __dianji_H
#define __dianji_H
#include "sys.h"
#include <stm32f10x.h>
 
 
#define HIGH_SPEED 1
#define LOW_SPEED 0
#define Moter1_CH3_Value  TIM2->CCR3 
#define Moter1_CH4_Value  TIM2->CCR4
#define Moter2_CH3_Value  TIM1->CCR1
#define Moter2_CH4_Value  TIM1->CCR4
 
 
void MOTOR1_PWM_Init(u16 arr,u16 psc);
void MOTOR2_PWM_Init(u16 arr,u16 psc);
void Motor_Forward(u8 speed);
void Motor_Left1(u16 value);
void Motor_Right1(u16 value);
void Motor_Left2(u16 value);
void Motor_Right2(u16 value);
void Motor_Back(void);
void Motor_Stop(void);
 
 
#endif

dianji.c文件

void MOTOR1_PWM_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<0; 	//TIM2时钟使能    
	RCC->APB2ENR|=1<<2;    	//使能PORTA时钟	
	GPIOA->CRL&=0XFFFF00FF;	//   pa2=tim2  ch3    pa3=tim2  ch4
	GPIOA->CRL|=0X0000BB00;	//复用功能推晚输出 	
 
	   
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XFFFFFCFF; //清除MAPR的[9:8] //  pa2 - ch3    pa3-ch4 
	//AFIO->MAPR|=1<<9;      //部分重映像
 
	TIM2->ARR=arr;			//设定计数器自动重装值 
	TIM2->PSC=psc;			//预分频器不分频
	TIM2->CR1=0x0080;   	//ARPE使能 
	TIM2->CCMR2|=7<<12;  	//CH2 PWM2模式	
	TIM2->CCMR2|=1<<11; 	//CH2预装载使能	   
//	TIM2->CCER|=1<<12;   	//OC4 输出使能	   
	
	TIM2->CCMR2|=7<<4;  	//CH3 PWM2模式	
	TIM2->CCMR2|=1<<3; 		//CH3预装载使能	   
	//TIM2->CCER|=1<<8;   	//OC3 输出使能	   	
	TIM2->CR1|=0x01;    	//使能          定时器3 	定时器2
}
void MOTOR2_PWM_Init(u16 arr,u16 psc)
{
	RCC->APB2ENR|=1<<11; 	//TIM1时钟使能    
	RCC->APB2ENR|=1<<2;    	//使能PORTA时钟	
 
	GPIOA->CRH&=0XFFFF0FF0;	//PB0、PB1输出     PA8   PA11
	GPIOA->CRH|=0X0000B00B;	//复用功能输出 	   复用功能开漏输出模式
	   
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XFFFFFF3F; //清除MAPR的[7:6]     CH4/PA11,CH1/PA8
	//AFIO->MAPR|=1<<11;      //部分重映像
	TIM1->BDTR|=1<<15;
	TIM1->ARR=arr;			//设定计数器自动重装值 
	TIM1->PSC=psc;			//预分频器不分频
	TIM1->CR1=0x0080;   	//ARPE使能 
	TIM1->CCMR2|=7<<12;  	//CH4 PWM2模式	
	TIM1->CCMR2|=1<<11; 		//CH4预装载使能	     
	
	TIM1->CCMR1|=7<<4;  	//CH3 PWM2模式	
	TIM1->CCMR1|=1<<3; 		//CH3预装载使能	    
	TIM1->CR1|=0x01;    	//使能定时器1
}
void Motor_Stop(void)
{
	TIM1->CCER|=1<<0;   	//OC3 输出使能
	TIM1->CCER|=1<<12;   	//OC4 输出使能
	TIM2->CCER|=1<<8;   	//OC3 输出使能
	TIM2->CCER|=1<<12;   	//OC4 输出使能	
	Moter1_CH3_Value=0;
	Moter2_CH3_Value=0;
	Moter1_CH4_Value=0;    //输出全为低电平
	Moter2_CH4_Value=0;
	delay_ms(500);
	TIM1->CCER&=~(1<<0);   	//OC3 输出禁止
	TIM1->CCER&=~(1<<12);   	//OC4 输出禁止
	TIM2->CCER&=~(1<<8);   	//OC3 输出禁止
	TIM2->CCER&=~(1<<12);   	//OC4 输出禁止
}
void Motor_Forward(u8 speed)  
{
	TIM2->CCER&=~(1<<12);   	//OC4 输出禁止
	TIM1->CCER&=~(1<<12);   	//OC4 输出禁止
	TIM1->CCER|=1<<0;   	//TIM3 OC1 输出使能
	TIM2->CCER|=1<<8;   	//TIM2 OC1 输出使能	
	
	switch (speed)
	{
		case 0:
		{						
			Moter1_CH3_Value=390;
			Moter2_CH3_Value=350;			
			break;			
		}
		case 1:
		{
			Moter1_CH3_Value=450;
			Moter2_CH3_Value=440;
			break;
		}
	}
}
void Motor_Left1(u16 value)
{
	TIM2->CCER|=1<<8;   	//OC3 输出使能
	TIM2->CCER&=~(1<<12);   	//OC4 输出禁止
	TIM1->CCER|=1<<12;   	//OC4 输出使能
	TIM1->CCER&=~(1<<0);   	//OC3 输出禁止	
	
	
	Moter1_CH3_Value=150;
	Moter2_CH4_Value=300;
	delay_ms(value);
	TIM1->CCER&=~(1<<12);   	//OC4 输出禁止
	TIM2->CCER&=~(1<<8);   	//OC3 输出使能
}
void Motor_Right1(u16 value)
{
	TIM1->CCER|=1<<0;   	//TIM3 OC1 输出使能
	TIM2->CCER&=~(1<<8);   	//OC3 输出禁止
	TIM2->CCER|=1<<12;   	//OC4 输出使能
	TIM1->CCER&=~(1<<12);   	//OC4 输出禁止
	
	Moter2_CH3_Value=300;
	Moter1_CH4_Value=150;
	delay_ms(value);
	TIM2->CCER&=~(1<<12);   	//OC4 输出禁止
	TIM1->CCER&=~(1<<0);   	//OC3 输出使能
}
void Motor_Left2(u16 value)
{
	Moter2_CH3_Value=990;
	Moter1_CH3_Value=410;
	delay_ms(value);
}
void Motor_Right2(u16 value)
{
	Moter1_CH3_Value=990;
	Moter2_CH3_Value=350;
	delay_ms(value);
}
void Motor_Back(void)
{
	TIM1->CCER|=1<<12;   	//OC4 输出使能
	TIM2->CCER|=1<<12;   	//OC4 输出使能
	TIM2->CCER&=~(1<<8);   	//OC3 输出禁止
	TIM1->CCER&=~(1<<0);   	//OC3 输出禁止
	
	Moter1_CH4_Value=50;
	Moter2_CH4_Value=50;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值