STM32/STM8技术论坛
直播中

袁晴

9年用户 19经验值
擅长:可编程逻辑 模拟技术 MEMS/传感技术
私信 关注
[问答]

关于STM32F103调直流电机正反转的问题!!!

最近在调直流电机,用的是L298N驱动板,用光电管返回信号给A0脚,来控制A4和A5脚,A4和A5脚分别产生高低电平给L298N的IN1和IN2,IN1和IN2控制正反转,使能控制转速,我现在知道如何用定时器产生PWM来控制转速,但在给IN1和IN2输出高低电平来控制正反转时,电机一直只向一个方向来转,不执行正反转功能,光电管没有控制4和5的电平。
就是这个问题  二楼附上代码,求各位大神指教我到底哪里出错了!!
  • 无标题-3.jpg

回帖(7)

袁晴

2017-4-16 21:29:18
#include "bsp_breathing.h"
uint16_t indexWave[] = {400,600,800,1000,1500,1500,1000,800,400};

/**
  * @brief  ÅäÖÃTIM3¸´ÓÃÊä³öPWMʱÓõ½µÄI/O
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void TIMx_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOB clock enable */
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  macTIM_GPIO_APBxClock_FUN  ( macTIM_GPIO_CLK, ENABLE );  //¿ªGPIOBµÄʼʱÖÓ

  /* ÅäÖÃPWMÓõ½µÄPB0Òý½Å */
  GPIO_InitStructure.GPIO_Pin =  macTIM_LED_PIN ;       //PB0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // ¸´ÓÃÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init( macTIM_LED_PORT, &GPIO_InitStructure );
}

static void NVIC_Config_PWM(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* ÅäÖÃTIM3_IRQÖжÏΪÖжÏÔ´ */
  NVIC_InitStructure.NVIC_IRQChannel = macTIMx_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> ÖÐ¶Ï & TIMxCNT ÖØÐ¼ÆÊý
*                    TIMx_CCR(µçƽ·¢Éú±ä»¯)
*
* ÐźÅÖÜÆÚ=(TIMx_ARR +1 ) * ʱÖÓÖÜÆÚ
*
*/
static void TIMx_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;                                                                                                                                                               
       
       
        /* ÉèÖÃTIM3CLK ʱÖÓΪ72MHZ */
//  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                                         //ʹÄÜTIM3ʱÖÓ
        macTIM_APBxClock_FUN ( macTIM_CLK, ENABLE );

  /* »ù±¾¶¨Ê±Æ÷ÅäÖà */                 
  TIM_TimeBaseStructure.TIM_Period = 2000-1;                                                                 //µ±¶¨Ê±Æ÷´Ó0¼ÆÊý1999£¬¼´Îª2000´Î£¬ÎªÒ»¸ö¶¨Ê±ÖÜÆÚ
  TIM_TimeBaseStructure.TIM_Prescaler = 72-1;                                                                    //ÉèÖÃÔ¤·ÖƵ£º
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                        //ÉèÖÃʱÖÓ·ÖÆµÏµÊý£º²»·ÖƵ(ÕâÀïÓò»µ½)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //ÏòÉϼÆÊýģʽ
  TIM_TimeBaseInit(macTIMx, &TIM_TimeBaseStructure);

  /* PWMģʽÅäÖà */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                            //ÅäÖÃΪPWMģʽ1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //ʹÄÜÊä³ö
  TIM_OCInitStructure.TIM_Pulse = 0;                                                                                                          //ÉèÖóõʼPWMÂö³å¿í¶ÈΪ0       
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;            //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR1_ValʱΪµÍµçƽ

  macTIM_OCxInit ( macTIMx, &TIM_OCInitStructure );                                                                                 //ʹÄÜͨµÀ3
       

  macTIM_OCxPreloadConfig ( macTIMx, TIM_OCPreload_Enable );                                                //ʹÄÜÔ¤×°ÔØ       

  TIM_ARRPreloadConfig(macTIMx, ENABLE);                                                                                                         //ʹÄÜTIM3ÖØÔØ¼Ä´æÆ÷ARR

  /* TIM3 enable counter */
  TIM_Cmd(macTIMx, ENABLE);                                                                                                   //ʹÄܶ¨Ê±Æ÷3       
       
        TIM_ITConfig(macTIMx, TIM_IT_Update, ENABLE);                                                                                //ʹÄÜupdateÖжÏ
               
        NVIC_Config_PWM();                                                                                                                                                                        //ÅäÖÃÖжÏÓÅÏȼ¶               
       
}

void GDG_GPIO_Config(void)                                                        //¹âµç¹Ü¼ì²âÒý½Å
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void MOTORA_L_GPIO_Config(void)                                                               
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
         
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
                GPIO_ResetBits(GPIOA, GPIO_Pin_4);       
                GPIO_SetBits(GPIOA, GPIO_Pin_5);
}

void MOTORA_R_GPIO_Config(void)                                                               
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
         
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
                GPIO_SetBits(GPIOA, GPIO_Pin_4);
                GPIO_ResetBits(GPIOA, GPIO_Pin_5);
}



void Delay(__IO u32 nCount)
{
                for(; nCount != 0; nCount--);
}
void jiance(void){
        if(GPIO_Pin_0!=0){
                MOTORA_L_GPIO_Config();
                Delay(0x0FFFFF);
        }
        else {
                MOTORA_R_GPIO_Config();
                Delay(0x0FFFFF);               
        }       
}

void TIMx_Breathing_Init(void)
{
        TIMx_GPIO_Config();
        TIMx_Mode_Config();       
        jiance();
}
举报

袁晴

2017-4-16 21:30:40
求看哪里有问题!
举报

人中狼

2017-4-16 21:37:03
要看芯片资料。
举报

袁晴

2017-4-17 19:50:06
引用: 人中狼 发表于 2017-4-16 21:37
要看芯片资料。

我看了L298N的技术资料,明白高低电平来控制转动方向,我的问题就是编程的问题,4和5程序里让他产生两种信号,但只产生一种,想知道哪里出问题了_(:з」∠)_         
举报

袁晴

2017-4-17 19:50:42
希望大神指教程序哪里有问题!
举报

王亚蒙

2017-11-18 11:10:00
你用的是有刷电机还是无刷电机?单片机用的是什么芯片?
举报

leexuan

2020-8-14 02:15:57
兄dei,我也遇到你这种问题,想知道你是怎么解决的?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分