野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 343|回复: 0

STM32F103VET6+L298N驱动电机运转代码

[复制链接]
发表于 2025-10-25 17:13:49 | 显示全部楼层 |阅读模式
本帖最后由 半度丶 于 2025-10-25 17:23 编辑

这两天试了一下用L298N模块驱动电机,特将代码与大家一起分享

main.c
  1. #include "stm32f10x.h"
  2. #include "bsp_L298N.h"
  3. #include "bsp_systick.h"

  4. /**
  5.   * [url=home.php?mod=space&uid=41770]@brief[/url]  主函数
  6.   * @param  无
  7.   * @retval 无
  8.   */
  9. int main(void)
  10. {        
  11.   
  12.   L298N_GPIO_Init();
  13.         PWM_Init();
  14.   while(1)
  15.         {        
  16.     MotorA_Dir(0);
  17.     MotorA_SetSpeed(500);
  18.         }        
  19. }
复制代码
bsp_L298N.c
  1. #include "bsp_L298N.h"

  2. void L298N_GPIO_Init(void)
  3. {
  4.         RCC_APB2PeriphClockCmd(L298N_IN1_GPIO_CLK, ENABLE);
  5.         RCC_APB2PeriphClockCmd(L298N_IN2_GPIO_CLK, ENABLE);
  6.         
  7.         GPIO_InitTypeDef  GPIO_InitStructure;
  8.         GPIO_InitStructure.GPIO_Pin = L298N_IN1_GPIO_PIN;
  9.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  11.   GPIO_Init(L298N_IN1_GPIO_PORT, &GPIO_InitStructure);
  12.         
  13.         GPIO_InitStructure.GPIO_Pin = L298N_IN2_GPIO_PIN;
  14.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  16.   GPIO_Init(L298N_IN2_GPIO_PORT, &GPIO_InitStructure);
  17. }

  18. void L298N_PWM_GPIO_Init(void)
  19. {
  20.         RCC_APB2PeriphClockCmd(L298N_ENA_GPIO_CLK, ENABLE);
  21.         GPIO_InitTypeDef  GPIO_InitStructure;
  22.         GPIO_InitStructure.GPIO_Pin = L298N_ENA_GPIO_PIN;
  23.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         
  25.   GPIO_Init(L298N_ENA_GPIO_PORT, &GPIO_InitStructure);

  26. }

  27. void PWM_Init(void)
  28. {                L298N_PWM_GPIO_Init();
  29.     RCC_APB1PeriphClockCmd(L298N_ENA_TIM_CLK, ENABLE);
  30.         /*--------------------时基结构体初始化-------------------------*/
  31.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  32.         // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  33.         TIM_TimeBaseStructure.TIM_Period=L298N_ENA_TIM_PERIOD;         // ARR
  34.         // 驱动CNT计数器的时钟 = Fck_int/(psc+1)                                                                        // PSC
  35.         TIM_TimeBaseStructure.TIM_Prescaler= L298N_ENA_TIM_PSC;        
  36.         // 时钟分频因子 ,配置死区时间时需要用到
  37.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  38.         // 计数器计数模式,设置为向上计数
  39.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  40.         // 重复计数器的值,没用到不用管
  41.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        
  42.         // 初始化定时器
  43.         TIM_TimeBaseInit(L298N_ENA_TIM, &TIM_TimeBaseStructure);
  44.         
  45.         /*--------------------输出结构体初始化-------------------*/               
  46.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  47.         // 配置为PWM模式1
  48.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  49.         // 输出使能
  50.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  51.         // 输出通道电平极性配置
  52.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  53.   TIM_OC3Init(L298N_ENA_TIM, &TIM_OCInitStructure);
  54.         TIM_OC3PreloadConfig(L298N_ENA_TIM, TIM_OCPreload_Enable);// CH3 -> PA2 -> ENA
  55.   TIM_Cmd(L298N_ENA_TIM, ENABLE);
  56. }

  57. void MotorA_Dir(uint8_t dir)
  58. {if (dir)
  59.     {
  60.         GPIO_SetBits(L298N_IN1_GPIO_PORT, L298N_IN1_GPIO_PIN);
  61.         GPIO_ResetBits(L298N_IN2_GPIO_PORT, L298N_IN2_GPIO_PIN);
  62.     }
  63. else
  64.     {
  65.         GPIO_ResetBits(L298N_IN1_GPIO_PORT, L298N_IN1_GPIO_PIN);
  66.         GPIO_SetBits(L298N_IN2_GPIO_PORT, L298N_IN2_GPIO_PIN);
  67.     }
  68. }
  69. // 电机A设置速度(0~1000)
  70. void MotorA_SetSpeed(uint16_t speed)
  71. {
  72.     TIM_SetCompare3(TIM2, speed); // TIM2_CH3 -> ENA
  73. }
复制代码
bsp_L298N.h
  1. #ifndef __BSP_L298N_H_
  2. #define        __BSP_L298N_H_

  3. #include "stm32f10x.h"

  4. #define L298N_IN1_GPIO_PIN         GPIO_Pin_1
  5. #define L298N_IN1_GPIO_PORT        GPIOB
  6. #define L298N_IN1_GPIO_CLK         RCC_APB2Periph_GPIOB

  7. #define L298N_IN2_GPIO_PIN         GPIO_Pin_5
  8. #define L298N_IN2_GPIO_PORT        GPIOB
  9. #define L298N_IN2_GPIO_CLK         RCC_APB2Periph_GPIOB

  10. #define L298N_ENA_GPIO_PIN         GPIO_Pin_2
  11. #define L298N_ENA_GPIO_PORT        GPIOA
  12. #define L298N_ENA_GPIO_CLK         RCC_APB2Periph_GPIOA

  13. #define L298N_ENA_TIM_CLK                RCC_APB1Periph_TIM2
  14. #define L298N_ENA_TIM              TIM2

  15. // PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
  16. #define L298N_ENA_TIM_PERIOD       (1000-1)
  17. #define L298N_ENA_TIM_PSC          (72-1)
  18. #define L298N_ENA_TIM_PULSE                                        5000

  19. void L298N_GPIO_Init(void);
  20. void L298N_PWM_GPIO_Init(void);
  21. void PWM_Init(void);
  22. void MotorA_Dir(uint8_t dir);
  23. void MotorA_SetSpeed(uint16_t speed);

  24. #endif
复制代码

bsp_systick.c
  1. #include "bsp_systick.h"

  2. #if 0
  3. static __INLINE uint32_t SysTick_Config(uint32_t ticks)
  4. {
  5.   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
  6.                                                                
  7.   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  8.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  9.   
  10.         SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  11.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  12.                    SysTick_CTRL_TICKINT_Msk   |
  13.                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  14.   return (0);                                                  /* Function successful */
  15. }
  16. #endif

  17. void SysTick_Delay_ms(uint32_t ms)
  18. {
  19.         uint32_t i;
  20.         SysTick_Config(72000);
  21.         
  22.         for(i=0;i<ms;i++)
  23.         {
  24.                 while(!((SysTick->CTRL)&(1<<16)));
  25.         }
  26.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  27. }

  28. void SysTick_Delay_us(uint32_t us)
  29. {
  30.         uint32_t i;
  31.         SysTick_Config(72);
  32.         
  33.         for(i=0;i<us;i++)
  34.         {
  35.                 while(!((SysTick->CTRL)&(1<<16)));
  36.         }
  37.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  38. }
复制代码
bsp_systick.h
  1. #ifndef _BSP_SYSTICK_H_
  2. #define _BSP_SYSTICK_H_

  3. #include "stm32f10x.h"
  4. #include "core_cm3.h"

  5. void SysTick_Delay_ms(uint32_t ms);
  6. void SysTick_Delay_us(uint32_t us);

  7. #endif
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-5 15:36 , Processed in 0.154095 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表