关于L298N的控制程序改进问题

2019-07-15 10:24发布

问题是我发现连接电路后,通上电之后,电机根本没有转,测了L298N的输出端电压,也没有反应
大家帮忙看下代码有没有毛病~
有相应附件,里面有相应的代码,可能会比较乱,作为初学者的我也是很无奈,希望大神们能够帮忙指点一下说一下里面有什么1. L298N的控制程序;2. LED流水灯。
解释下硬件     STM32f407ZGT6(MCU启明开发板高配)   L298N   两个直流电机

L298N1.rar 下载积分: 积分 -1 分
4.3 MB, 下载次数: 9, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
人中狼
1楼-- · 2019-07-15 16:35
 精彩回答 2  元偷偷看……
快乐开心就好
2楼-- · 2019-07-15 16:44
人中狼 发表于 2017-6-20 22:44
最好能把觉得有问题的代码贴上来,下载附件的方式有时并不太方便,对于stm32引脚设置是否正确,也L298N的连接是否正确

编译的时候并没有报错,所以我就不是很清楚了
快乐开心就好
3楼-- · 2019-07-15 19:53
针对于,上述问题,我也不知道哪里错了,所以我把函数主体放出来吧
  1. #include "stm32f4xx.h"
  2. #include "led.h"
  3. #include "led1.h"

  4. #define        MOTOR_L_IN1_LOW                        (GPIO_ResetBits(GPIOB, GPIO_Pin_6))
  5. #define        MOTOR_L_IN1_HIGH                (GPIO_SetBits(GPIOB, GPIO_Pin_6))
  6. #define        MOTOR_L_IN2_LOW                        (GPIO_ResetBits(GPIOB, GPIO_Pin_5))
  7. #define        MOTOR_L_IN2_HIGH                (GPIO_SetBits(GPIOB, GPIO_Pin_5))

  8. #define        MOTOR_R_IN1_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_11))
  9. #define        MOTOR_R_IN1_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_11))
  10. /*C10引脚找不到
  11. #define        MOTOR_R_IN2_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_10))
  12. #define        MOTOR_R_IN2_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_10))
  13. 改用C7引脚*/
  14. #define        MOTOR_R_IN2_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_7))
  15. #define        MOTOR_R_IN2_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_7))
  16. //左轮初始化
  17.        
  18. void        MotorDriver_L_Config(void){
  19.        
  20.         GPIO_InitTypeDef GPIO_InitStructure ;
  21.         TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
  22.         TIM_OCInitTypeDef TIM_OCInitStructure;
  23.        
  24.         /*使能GPIOB、TIM1外设时钟*/
  25.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  26.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  27.        
  28.         /*初始化PB6端口为Out_PP模式*/
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  30.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  31.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  34.        
  35.         /*初始化PB8端口为Out_PP模式*/
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  38.        
  39.         /*初始化PA7端口(TIM4_CH2)为AF_PP模式推挽输出*/
  40.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  41.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  42.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  44.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  45.        
  46.         /*定时器基本配置time3 的 ch2通道*/
  47.         TIM_BaseInitStructure.TIM_Prescaler = 3-1;                                                                        //时钟预分频数3,TIM8的计数时钟频率为24MHz
  48.         TIM_BaseInitStructure.TIM_Period = 1000-1;                                                                        //自动重装载寄存器数值,PWM2频率为24MHz/1000=24KHz
  49.         TIM_BaseInitStructure.TIM_ClockDivision = 0;                                                                //采样分频
  50.         TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;                                        //向上计数
  51.         TIM_BaseInitStructure.TIM_RepetitionCounter = 0;                                                        //重复寄存器,是重复计数,就是重复溢出多少次才给你来一个溢出中断,
  52.         TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

  53.         TIM_OCStructInit(&TIM_OCInitStructure);
  54.        
  55.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                                    /*PWM2  ch2输出模式PWM模式2- 在向上计数时,
  56.                                                                                                                                                                 一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
  57.                                                                                                                                                                 有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平
  58.                                                                                                                                                                 ,否则为无效电平。*/
  59.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                                //使能该通道输出
  60.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                        //输出极性
  61.         TIM_OC4Init(TIM1, &TIM_OCInitStructure);                                                                        //按指定参数初始化

  62.         TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                        //使能TIM8在CCR上的预装载寄存器
  63.         TIM_ARRPreloadConfig(TIM1, ENABLE);                                                                                        //使能TIM8在ARR上的预装载寄存器
  64.        
  65.         TIM_Cmd(TIM1, ENABLE);                                                                                                                //使能TIM8
  66.         TIM_CtrlPWMOutputs(TIM1, ENABLE);                                                                                        //使能TIM8,PWM                                                                                                                                                //PWM输出使能                       
  67. }


  68. //右轮初始化
  69. void        MotorDriver_R_Config(void){

  70.         GPIO_InitTypeDef GPIO_InitStructure ;
  71.         TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
  72.         TIM_OCInitTypeDef TIM_OCInitStructure;

  73.         /*使能GPIOc、TIM8外设时钟*/
  74.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  75.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  76.         /*初始化PC10端口为Out_PP模式*/
  77.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  78.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  79.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  80.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  81.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  82.         /*初始化PC11端口为Out_PP模式*/
  83.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  84.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  85.         /*初始化PC9端口(TIM8_CH4)为AF_PP模式*/
  86.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  87.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  88.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  89.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  90.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  91.         /*定时器基本配置time8 的 ch4通道*/
  92.         TIM_BaseInitStructure.TIM_Prescaler = 3-1;                                                                                                //时钟预分频数psc=3,TIM8的计数时钟频率为24MHz
  93.         TIM_BaseInitStructure.TIM_Period = 1000-1;                                                                                                //自动重装载寄存器数值arr=1000,PWM2频率为24MHz/1000=24KHz
  94.         TIM_BaseInitStructure.TIM_ClockDivision = 0;                                                                                        //采样分频
  95.         TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;                                                                //向上计数
  96.         TIM_BaseInitStructure.TIM_RepetitionCounter = 0;                                                                                //重复寄存器
  97.         TIM_TimeBaseInit(TIM8, &TIM_BaseInitStructure);

  98.         //TIM_OCStructInit(&TIM_OCInitStructure);
  99.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                                                                                //PWM2  ch2输出模式
  100.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                                                        //使能该通道输出
  101.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                                                //输出极性
  102.         TIM_OC4Init(TIM8, &TIM_OCInitStructure);                                                                                                //按指定参数初始化

  103.         TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                                                //使能TIM8在CCR上的预装载寄存器
  104.         TIM_ARRPreloadConfig(TIM8, ENABLE);                                                                                                        //使能TIM8在ARR上的预装载寄存器
  105.        
  106.         TIM_Cmd(TIM8, ENABLE);                                                                                                                                //打开TIM8
  107.         TIM_CtrlPWMOutputs(TIM8, ENABLE);                                                                                                                //PWM输出使能
  108. }

  109. //LED对应IO初始化
  110. void LED_Init(void)
  111. {             
  112.   GPIO_InitTypeDef  GPIO_InitStructure;

  113.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOG, ENABLE);//使能GPIOG时钟

  114.   //PG13、PG14和PG15初始化设置
  115.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;         //LED0、LED1和LED2对应IO口
  116.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                  //普通输出模式
  117.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                 //推挽输出
  118.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;             //100MHz
  119.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                   //上拉
  120.   GPIO_Init(GPIOE, &GPIO_InitStructure);                         //初始化GPIO
  121.        
  122.         GPIO_SetBits(GPIOE, GPIO_Pin_3 | GPIO_Pin_4);   
  123.        
  124.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  125.          GPIO_Init(GPIOG, &GPIO_InitStructure);
  126.    GPIO_SetBits(GPIOG, GPIO_Pin_9);
  127. }

  128. void        MotorDriver_L_Turn_Forward(void){                        //左轮电机正转
  129.        
  130.         MOTOR_L_IN1_LOW;
  131.         MOTOR_L_IN2_HIGH;
  132. }

  133. void        MotorDriver_L_Turn_Reverse(void){                        //左轮电机反转
  134.        
  135.         MOTOR_L_IN1_HIGH;
  136.         MOTOR_L_IN2_LOW;
  137. }

  138. void        MotorDriver_R_Turn_Forward(void){                        //右轮电机正转
  139.        
  140.         MOTOR_R_IN1_HIGH;
  141.         MOTOR_R_IN2_LOW;
  142. }

  143. void        MotorDriver_R_Turn_Reverse(void){                        //右轮电机反转
  144.        
  145.         MOTOR_R_IN1_LOW;
  146.         MOTOR_R_IN2_HIGH;
  147. }

  148. void        MotorDriver_L_Turn_Stop(void)                                //左轮电机制动
  149. {
  150.         MOTOR_L_IN1_HIGH;
  151.         MOTOR_L_IN2_HIGH;
  152. }
  153. void        MotorDriver_R_Turn_Stop(void)                                //右轮电机制动
  154. {
  155.         MOTOR_R_IN1_HIGH;
  156.         MOTOR_R_IN2_HIGH;
  157. }

  158. void        MotorDriver_Init(void){
  159.        
  160.         MotorDriver_R_Config();
  161.         MotorDriver_L_Config();
  162.        
  163.         MotorDriver_L_Turn_Stop();                                //左轮电机制动
  164.         MotorDriver_R_Turn_Stop();                                //右轮电机制动
  165. }

  166. int main(void)
  167. {
  168.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
  169.         delay_init();                   //初始化延时函数
  170.         LED_Init();                                 //初始化LED端口

  171.         MotorDriver_L_Config();
  172.         MotorDriver_R_Config();
  173.        
  174.   while(1)
  175.         {
  176.     LED0=0;     //LED0亮
  177.     LED1=1;     //LED1灭
  178.     LED2=1;     //LED2灭
  179.                
  180.     delay_ms(500);
  181.                 LED0=1;     //LED0灭
  182.     LED1=0;     //LED1亮
  183.     LED2=1;     //LED2灭
  184.                  
  185.                 delay_ms(500);
  186.                 LED0=1;     //LED0灭
  187.     LED1=1;     //LED1灭
  188.     LED2=0;     //LED2亮
  189.     delay_ms(500);
  190.        
  191.         MotorDriver_L_Turn_Reverse();
  192.   delay_ms(1000);

  193.         }

  194. }
复制代码
人中狼
4楼-- · 2019-07-16 00:03
编译没报错是代表没有语法错误,运行不正常,代表逻辑错误或时序错误,大部分bug都属于后者。把L298N部分的程序贴上来吧,L298N驱动直流电机不复杂,应该只是控制问题而已
快乐开心就好
5楼-- · 2019-07-16 02:26
人中狼 发表于 2017-6-21 08:13
编译没报错是代表没有语法错误,运行不正常,代表逻辑错误或时序错误,大部分bug都属于后者。把L298N部分的程序贴上来吧,L298N驱动直流电机不复杂,应该只是控制问题而已

刚放上去
快乐开心就好
6楼-- · 2019-07-16 05:52
 精彩回答 2  元偷偷看……

一周热门 更多>