失能定时器后 原来用于输出PWM的通道偶尔会产生高电平

2019-07-20 17:15发布

本帖最后由 Xprince 于 2017-1-19 23:26 编辑

探索者开发板 通过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;
}














0条回答

一周热门 更多>