目录复制
K016 基于51/STM32 ES08A舵机测试 按键控制正反转
一. 实现功能
上电后ES08A舵机无动作,按正转按键,按一次角度增加一次,按反转按键,按一次角度减少一次。 注意事项:1. ES08A舵机需要单独供电,不可用最小系统板供电, 2.PWM信号引脚需要加一个上拉电阻才行,大概4.7K左右。
二. 硬件清单
- ES08A舵机
- STM32F103C8T6最小系统板/STC89C52RC最小系统板
- SWD或JLINK仿真器(直接用CH340串口模块烧录也行,不过注意配置BOOT)
- 杜邦线若干
- 按键模块
三. 资料清单
程序代码
文档资料
四. ES08A舵机简介与驱动方式
1.基本参数
2.引脚说明
红线-----------------VCC
灰黑线---------------GND
黄线-----------------PWM输入信号线
五. 接线
基于STM32 + ES08A舵机接线
基于51 + ES08A舵机接线
六.代码说明
以下以32代码为例,
1. ES08A舵机PWM引脚配置
void GENERAL_TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
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配置函数
void GENERAL_TIM_Mode_Config(void)
{
GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;
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;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
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. 主函数
int main(void)
{
GENERAL_TIM_Init();
DelayInit();
Key_GPIO_Init();
while(1)
{
Scan_key();
turn_Reverse();
}
}
七.资料获取
加群私聊群主可免费获得,也可加群学习交流 群号:1041406448。
|