探索者开发板 通过L298N控制二驱小车前进 倒退 停止 ,用三个按键控制,问题是前进或者倒退的时候按停止键 偶尔会出现停不下来,这时候感觉定时器输出PWM通道一直为1了所以反而停不下来
不知道什么原因,麻烦各位大神 分析一下哪里有BUG
int main (void)
{
u8 key;
delay_init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_INIT();
KEY_init();
tim4_init(5000-1,8399);
while(1)
{
key=KEY_Scan();
if(key)
{
switch(key)
{
case 1: //正转
{
TIM_Cmd(TIM4,ENABLE);
GPIO_SetBits(GPIOF, GPIO_Pin_3);
GPIO_ResetBits(GPIOF, GPIO_Pin_4);
GPIO_SetBits(GPIOF, GPIO_Pin_5);
GPIO_ResetBits(GPIOF, GPIO_Pin_6);
break;
}
case 2://反转
{
TIM_Cmd(TIM4,ENABLE);
GPIO_ResetBits(GPIOF, GPIO_Pin_3);
GPIO_SetBits(GPIOF, GPIO_Pin_4);
GPIO_ResetBits(GPIOF, GPIO_Pin_5);
GPIO_SetBits(GPIOF, GPIO_Pin_6);
break;
}
case 3: //停止
{
TIM_Cmd(TIM4,DISABLE);
GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7 );
break;
}
}
}
}
}
#include "LED.h"
#include "stm32f4xx.h"
void LED_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
GPIO_InitTypeDef GPIO_InitStru;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOB,ENABLE);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStrue.GPIO_OType=GPIO_OType_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStrue.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStrue);
GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7 );
GPIO_InitStru.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStru.GPIO_OType=GPIO_OType_PP;
GPIO_InitStru.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStru.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_InitStru.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOF,&GPIO_InitStru);
GPIO_ResetBits(GPIOF,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 );
}
#include "timer.h"
#include "sys.h"
void tim4_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStrue;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruc;
TIM_OCInitTypeDef TIM_OCInitStructR;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStrue.GPIO_OType=GPIO_OType_PP;
GPIO_InitStrue.GPIO_PuPd= GPIO_PuPd_DOWN;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB,&GPIO_InitStrue);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
TIM_TimeBaseInitStruc.TIM_Period=arr;
TIM_TimeBaseInitStruc.TIM_Prescaler=psc;
TIM_TimeBaseInitStruc.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruc.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruc);
TIM_OCInitStructR.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructR.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructR.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructR.TIM_Pulse=3500;
TIM_OC1Init(TIM4,&TIM_OCInitStructR);
TIM_OC2Init(TIM4,&TIM_OCInitStructR);
TIM_Cmd(TIM4,DISABLE);
}
#include "KEY.h"
#include "sys.h"
#include "delay.h"
#include "timer.h"
#include "LED.h"
void KEY_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
u8 KEY_Scan(void)
{
static u8 key_up=1;
if(key_up&&(KEY0==0||KEY1==1||KEY2==0))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0) return 2;
else if(KEY2==0)return 3;
}
else if(KEY0==1&&KEY1==1&&KEY2==1)key_up=1;
return 0;
} |