某控制系统操作箱上具有一个启动按钮和一个停止按钮,控制对象为一个采用模拟量控制的电机(-5+5对应-1500~+1500rpm)。工作场所具有4个接近开关。功能要求:按下启动按钮后电机以1000rpm正向转动,检测到开关1后速度变成200rpm,检测到开关2后反向以1000rpm转动,检测到开关3后速度变成200rpm,检测到开关4后再次正转。按下停止按钮后,电机停止转动。 规划输入输出资源并利用tm32实现以上功能,编写程序段(不需要完整程序,只要写出实现各个功能的程序段)。
时间: 2024-04-21 17:30:19 浏览: 45
规划输入输出资源:
1个启动按钮 -> 1个GPIO输入口
1个停止按钮 -> 1个GPIO输入口
4个接近开关 -> 4个GPIO输入口
电机 -> 1个PWM输出口
编写程序段:
1. 初始化GPIO输入输出口和PWM输出口
```
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //启动按钮
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //停止按钮
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; //接近开关
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PWM输出口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_2);
}
void PWM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999; //PWM频率为10kHz
TIM_TimeBaseStructure.TIM_Prescaler = 23; //定时器时钟为84MHz,分频后为3.5MHz,计数器每计1次需要3.5us
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //占空比为0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
```
2. 实现启动和停止按钮的功能
```
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) //启动按钮按下
{
TIM_SetCompare1(TIM3, 700); //占空比为70%
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)) //停止按钮按下
{
TIM_SetCompare1(TIM3, 0); //占空比为0
}
```
3. 实现接近开关的功能
```
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)) //检测到开关1
{
TIM_SetCompare1(TIM3, 150); //占空比为15%,速度为200rpm
}
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)) //检测到开关2
{
TIM_SetCompare1(TIM3, 700); //占空比为70%,反向转动
}
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)) //检测到开关3
{
TIM_SetCompare1(TIM3, 150); //占空比为15%,速度为200rpm
}
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5)) //检测到开关4
{
TIM_SetCompare1(TIM3, 700); //占空比为70%,正向转动
}
```