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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> K016 基于51/STM32 ES08A舵机测试 按键控制正反转 -> 正文阅读

[嵌入式]K016 基于51/STM32 ES08A舵机测试 按键控制正反转

目录复制

一. 实现功能

上电后ES08A舵机无动作,按正转按键,按一次角度增加一次,按反转按键,按一次角度减少一次。
注意事项:1. ES08A舵机需要单独供电,不可用最小系统板供电,
2.PWM信号引脚需要加一个上拉电阻才行,大概4.7K左右。

二. 硬件清单

  1. ES08A舵机
  2. STM32F103C8T6最小系统板/STC89C52RC最小系统板
  3. SWD或JLINK仿真器(直接用CH340串口模块烧录也行,不过注意配置BOOT)
  4. 杜邦线若干
  5. 按键模块

三. 资料清单

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

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

四. ES08A舵机简介与驱动方式

1.基本参数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.引脚说明

红线-----------------VCC
灰黑线---------------GND
黄线-----------------PWM输入信号线

五. 接线

基于STM32 + ES08A舵机接线

/******************************
按键引脚
正转按键KEY1---------------GPIOB_6
反转按键KEY1---------------GPIOB_7

舵机
PWM信号引脚----------------GPIOA_6
*******************************/
基于51 + ES08A舵机接线
/******************************
按键引脚
正转按键KEY1---------------P1.1
反转按键KEY1---------------P1.2

舵机
PWM信号引脚----------------P1.0
*******************************/

六.代码说明

以下以32代码为例,

1. ES08A舵机PWM引脚配置

/*--------------------初始化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. 按键引脚配置函数

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

3. 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);
	


	// 使能计数器
	TIM_Cmd(GENERAL_TIM, ENABLE);
}

4. 按键扫描函数

void Scan_key(void)
{
		uint16_t Key_Dat=0;
		Key_Dat=GPIO_ReadInputData(GPIOB);
		Key_Dat=Key_Dat&0x00C0;
		Key_Dat=Key_Dat^0x00C0;
		
		if(Key_Dat==K_Forward)
	  {
				 DelayMs(10);
				 if(Key_Dat==K_Forward)
					{
							Speed++;
							if(Speed>=199)
							{
									Speed=199;
							}
				  }
					while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6));
	   }
		
		else if(Key_Dat==K_Reverse)
	  {
				 DelayMs(10);
				 if(Key_Dat==K_Reverse)
					{
							Speed--;
							if(Speed<=1)
							{
									Speed=1;
							}
				  }
					while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7));
	   }
}

5. 主函数

/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{

	/* 定时器初始化 */
	GENERAL_TIM_Init();
	DelayInit();
	Key_GPIO_Init();


  while(1)
  {  
			
				Scan_key();
				turn_Reverse();
  }
}

七.资料获取

加群私聊群主可免费获得,也可加群学习交流 群号:1041406448。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:41:30  更:2021-10-30 12:42:25 
 
开发: 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 8:41:26-

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