说明:编程平台IAR,程序利用STM32CubeMX软件生成,单片机控制芯片STM32F407IGT6。
实现过程:根据电机驱动器,50%的pwm脉冲,电机停止,50%-100%,正转速度越来越大,50%-0%,反转速度越来越大。此设计是%60是正转,40%是反转,只涉及速度模式,不考虑精确控制问题。
首先设计一个中断函数,因为在定时器中不能用系统滴答的HAL_Delay();否则系统会卡死
void Delay(void)
{
uint16_t ii;
for(ii=0;ii<500;ii++)
{
}
}
定义四个来变量,用于后面的判断使用,把正转,停止,反转,停止,当作四个事件,用所定义的变量÷4取余,即可
uint16_t i=0,j=0,k=0,q=0;
下面是TIM1的通道1控制第一个电机
if(GPIO_Pin == GPIO_PIN_0)
{
if(i % 4 == 0)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
{
TIM1->CCR1 = 60;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
i++;
}
else if(i%4 == 1)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
i++;
}
else if(i%4 == 2)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
{
TIM1->CCR1 = 40;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
i++;
}
else
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
i++;
}
}
下面是利用TIM1的通道2控制第二个电机
//这个是利用TIM1的通道2,来控制第2个电机
else if(GPIO_Pin == GPIO_PIN_1)
{
if(j % 4 == 0)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
{
TIM1->CCR2 = 60;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
j++;
}
else if(j % 4 == 1)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
j++;
}
else if(j % 4 == 2)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
{
TIM1->CCR2 = 40;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
j++;
}
else
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
j++;
}
}
下面是TIM1的通道3控制第三个电机
//这个是利用TIM1的通道3,来控制第3个电机
else if(GPIO_Pin == GPIO_PIN_2)
{
if(k % 4 == 0)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
{
TIM1->CCR3 = 60;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
k++;
}
else if(k % 4 == 1)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
k++;
}
else if(k % 4 == 2)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
{
TIM1->CCR3 = 40;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
k++;
}
else
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
k++;
}
}
下面是同时利用TIM1的123同时控制三个电机
//这个是利用TIM1的通道1,2,3,来控制3个电机
else if(GPIO_Pin == GPIO_PIN_3)
{
if(q % 4 == 0)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
{
TIM1->CCR1 = 60;
TIM1->CCR2 = 60;
TIM1->CCR3 = 60;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
q++;
}
else if(q % 4 == 1)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
q++;
}
else if(q % 4 == 2)
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
{
TIM1->CCR1 = 40;
TIM1->CCR2 = 40;
TIM1->CCR3 = 40;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
q++;
}
else
{
Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
q++;
}
}
停止,不管三个电机怎么运动,按下此键,均停止
else
{
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
}
所有操作均在中断回调函数里面,一上四个if判断全部在回调函数中,
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
}