IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> K009 基于51/32 MAX1508双H桥电机驱动模块测试 -> 正文阅读

[嵌入式]K009 基于51/32 MAX1508双H桥电机驱动模块测试

一. 实现功能

按键 K_Start_Stop停止和启动电机,默认上电停止
按键 K_Syntropy_Reverse 切换两电机转向
按键 K_UP_Speed 加速按键,按下加速
按键 K_Down_Speed 减速按键,按下减速
此程序主要基于STM32F103C8T6驱动MAX1508电机一些动作,动作改变是用四个按键控制两个电机启动停止,同向反向和加减速。

二. 硬件清单

  1. MAX1508双H桥电机驱动模块
  2. STM32F103C8T6/STC89C52RC
  3. SWD或JLINK仿真器(直接用CH340串口模块烧录也行,不过注意配置BOOT)
  4. 直流电机马达(2)
  5. 4位按键模块
  6. 电源8V左右(这里用的是两节18650)

三. 资料清单

程序代码
在这里插入图片描述

文档资料
在这里插入图片描述

四. MAX1508双H桥电机驱动模块简介

  1. 双路1.5A*2,峰值电流可到2.5A, 内置过热保护电路,不用怕电机堵转烧坏,温度下降后自动恢复。
    2.直流电机驱动逻辑真值表:
    请添加图片描述

产品参数:
1.双路H桥电机驱动,可以同时驱动两路直流电机或者1个4线两相式步进电机;
2.模块供电电压2V-10V;
3.信号端输入电压1.8-7V;
4.单路工作电流1.5A,峰值电流可达2.5A,低待机电流 (小于 0.1uA);
5.内置防共态导通电路,输入端悬空时,电机不会误动作;
6.内置带迟滞效应的过热保护电路 (TSD),无需担心电机堵转;
7.产品尺寸: 24.7215mm (长宽高),超小体积,适合组装和车载;
8.安装孔直径:2 mm。
9.重量:5g
注意事项:
1.电源正极与负极接反肯定会造成电路损坏。
2.输出对地短路或输出端短路,还有电机堵转的情况下,芯片都会热保护的,但是在接近或者超过10V电压且峰值电流大大超过2.5A的情况下也会造成芯片烧毁。

五. 接线

在这里插入图片描述

六.代码说明

以下以32代码为例,

  1. IN1-IN4引脚配置
 /****初始化PWM输出引脚****/
void GENERAL_TIM_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道1 GPIO 初始化
	RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
	
	// 输出比较通道2 GPIO 初始化
	RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH2_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);
	
	// 输出比较通道3 GPIO 初始化
	RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH3_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH3_PORT, &GPIO_InitStructure);
	
	// 输出比较通道4 GPIO 初始化
	RCC_APB2PeriphClockCmd(GENERAL_TIM_CH4_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH4_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH4_PORT, &GPIO_InitStructure);
}
  1. 定时器与硬件PWM配置
/****初始化PWM输出引脚****/


/* ----------------   PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)

void GENERAL_TIM_Mode_Config(void)
{
  // 开启定时器时钟,即内部时钟CK_INT=72M
	GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

/*--------------------时基结构体初始化-------------------------*/
	// 配置周期,这里配置为100K
	
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
	TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;	
	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
	TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;	
	// 时钟分频因子 ,配置死区时间时需要用到
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
	// 计数器计数模式,设置为向上计数
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
	// 重复计数器的值,没用到不用管
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
	// 初始化定时器
	TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

	/*--------------------输出比较结构体初始化-------------------*/	
	// 占空比配置
	uint16_t CCR1_Val = 0;
	uint16_t CCR2_Val = 0;
	uint16_t CCR3_Val = 0;
	uint16_t CCR4_Val = 0;
	
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	// 配置为PWM模式1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	// 输出使能
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	// 输出通道电平极性配置	
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	
	// 输出比较通道 1
	TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
	TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
	
	// 输出比较通道 2
	TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
	TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
	
	// 输出比较通道 3
	TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
	TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
	
	// 输出比较通道 4
	TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
	TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
	
	// 使能计数器
	TIM_Cmd(GENERAL_TIM, ENABLE);
}

void GENERAL_TIM_Init(void)
{
	GENERAL_TIM_GPIO_Config();
	GENERAL_TIM_Mode_Config();		
}
  1. 按键引脚配置
 void Key_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启按键端口的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = K_Start_Stop; 
	// 设置按键的引脚为上拉输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	
//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = K_Syntropy_Reverse; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = K_UP_Speed; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = K_Down_Speed; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}
  1. 按键扫描函数
void Scan_key(void)
{
		uint16_t Key_Dat=0;
		Key_Dat=GPIO_ReadInputData(GPIOB);
		Key_Dat=Key_Dat&0x00F0;
		Key_Dat=Key_Dat^0x00F0;
		Key_Dat_Buf=Key_Dat;
		if(Key_Dat==K_Start_Stop)
	  {
				 DelayMs(10);
				 if(Key_Dat==K_Start_Stop)
					{
							Flag_Start_Stop=~Flag_Start_Stop;
				  }
					while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4));
	   }
		 
		else if(Key_Dat==K_Syntropy_Reverse)
	  {
				 DelayMs(10);
				 if(Key_Dat==K_Syntropy_Reverse)
					{
							Flag_Syntropy_Reverse=~Flag_Syntropy_Reverse;
				  }
					while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5));
	   }
		
		else if(Key_Dat==K_UP_Speed)
	  {
				 DelayMs(10);
				 if(Key_Dat==K_UP_Speed)
					{
							Speed=Speed+5;
							if(Speed>=999)
							{
									Speed=999;
							}
				  }
					while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6));
	   }
		
		else if(Key_Dat==K_Down_Speed)
	  {
				 DelayMs(10);
				 if(Key_Dat==K_Down_Speed)
					{
							Speed=Speed-5;
							if(Speed<=10)
							{
									Speed=10;
							}
				  }
					while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7));
	   }
}
  1. 电机驱动函数
/***同向转动***/
void turn_Syntropy()
{
		 TIM_SetCompare1(GENERAL_TIM, Speed);		//IN_1
		 TIM_SetCompare2(GENERAL_TIM, 0);				//IN_2
		 TIM_SetCompare3(GENERAL_TIM, Speed);		//IN_3
		 TIM_SetCompare4(GENERAL_TIM, 0);				//IN_4
}
/***反向转动***/
void turn_Reverse()
{
		 TIM_SetCompare1(GENERAL_TIM, 0);			//IN_1
		 TIM_SetCompare2(GENERAL_TIM, Speed); //IN_2
		 TIM_SetCompare3(GENERAL_TIM, 0);			//IN_3
		 TIM_SetCompare4(GENERAL_TIM, Speed); //IN_4
}
/***停止转动***/
void turn_Stop()
{
		 TIM_SetCompare1(GENERAL_TIM, 0);//IN_1
		 TIM_SetCompare2(GENERAL_TIM, 0);//IN_2
		 TIM_SetCompare3(GENERAL_TIM, 0);//IN_3
		 TIM_SetCompare4(GENERAL_TIM, 0);//IN_4
}
  1. 主函数
/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{

	/* 定时器初始化 */
	GENERAL_TIM_Init();
	DelayInit();
	Key_GPIO_Init();
	turn_Stop();
//	turn_Syntropy();
  while(1)
  {  
			
				Scan_key();
				if(Flag_Start_Stop)
				{
							
							if(!Flag_Syntropy_Reverse)
							{								
									turn_Syntropy();
							}
							else
							{
									turn_Reverse();								
							}											
				}
				else
				{
						turn_Stop();
					
				}			
  }
}

七.资料获取

加群私聊群主可免费获得,群号:1041406448。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:09:12  更:2021-10-17 12:10:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:37:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码