初中生
最后登录1970-1-1
在线时间 小时
注册时间2024-7-7
|
本帖最后由 半度丶 于 2025-10-25 17:23 编辑
这两天试了一下用L298N模块驱动电机,特将代码与大家一起分享
main.c
- #include "stm32f10x.h"
- #include "bsp_L298N.h"
- #include "bsp_systick.h"
- /**
- * [url=home.php?mod=space&uid=41770]@brief[/url] 主函数
- * @param 无
- * @retval 无
- */
- int main(void)
- {
-
- L298N_GPIO_Init();
- PWM_Init();
- while(1)
- {
- MotorA_Dir(0);
- MotorA_SetSpeed(500);
- }
- }
复制代码 bsp_L298N.c
- #include "bsp_L298N.h"
- void L298N_GPIO_Init(void)
- {
- RCC_APB2PeriphClockCmd(L298N_IN1_GPIO_CLK, ENABLE);
- RCC_APB2PeriphClockCmd(L298N_IN2_GPIO_CLK, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = L298N_IN1_GPIO_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(L298N_IN1_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = L298N_IN2_GPIO_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(L298N_IN2_GPIO_PORT, &GPIO_InitStructure);
- }
- void L298N_PWM_GPIO_Init(void)
- {
- RCC_APB2PeriphClockCmd(L298N_ENA_GPIO_CLK, ENABLE);
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = L298N_ENA_GPIO_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(L298N_ENA_GPIO_PORT, &GPIO_InitStructure);
- }
- void PWM_Init(void)
- { L298N_PWM_GPIO_Init();
- RCC_APB1PeriphClockCmd(L298N_ENA_TIM_CLK, ENABLE);
- /*--------------------时基结构体初始化-------------------------*/
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
- TIM_TimeBaseStructure.TIM_Period=L298N_ENA_TIM_PERIOD; // ARR
- // 驱动CNT计数器的时钟 = Fck_int/(psc+1) // PSC
- TIM_TimeBaseStructure.TIM_Prescaler= L298N_ENA_TIM_PSC;
- // 时钟分频因子 ,配置死区时间时需要用到
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- // 计数器计数模式,设置为向上计数
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
- // 重复计数器的值,没用到不用管
- TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
- // 初始化定时器
- TIM_TimeBaseInit(L298N_ENA_TIM, &TIM_TimeBaseStructure);
-
- /*--------------------输出结构体初始化-------------------*/
- TIM_OCInitTypeDef TIM_OCInitStructure;
- // 配置为PWM模式1
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- // 输出使能
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- // 输出通道电平极性配置
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OC3Init(L298N_ENA_TIM, &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(L298N_ENA_TIM, TIM_OCPreload_Enable);// CH3 -> PA2 -> ENA
- TIM_Cmd(L298N_ENA_TIM, ENABLE);
- }
- void MotorA_Dir(uint8_t dir)
- {if (dir)
- {
- GPIO_SetBits(L298N_IN1_GPIO_PORT, L298N_IN1_GPIO_PIN);
- GPIO_ResetBits(L298N_IN2_GPIO_PORT, L298N_IN2_GPIO_PIN);
- }
- else
- {
- GPIO_ResetBits(L298N_IN1_GPIO_PORT, L298N_IN1_GPIO_PIN);
- GPIO_SetBits(L298N_IN2_GPIO_PORT, L298N_IN2_GPIO_PIN);
- }
- }
- // 电机A设置速度(0~1000)
- void MotorA_SetSpeed(uint16_t speed)
- {
- TIM_SetCompare3(TIM2, speed); // TIM2_CH3 -> ENA
- }
复制代码 bsp_L298N.h
- #ifndef __BSP_L298N_H_
- #define __BSP_L298N_H_
- #include "stm32f10x.h"
- #define L298N_IN1_GPIO_PIN GPIO_Pin_1
- #define L298N_IN1_GPIO_PORT GPIOB
- #define L298N_IN1_GPIO_CLK RCC_APB2Periph_GPIOB
- #define L298N_IN2_GPIO_PIN GPIO_Pin_5
- #define L298N_IN2_GPIO_PORT GPIOB
- #define L298N_IN2_GPIO_CLK RCC_APB2Periph_GPIOB
- #define L298N_ENA_GPIO_PIN GPIO_Pin_2
- #define L298N_ENA_GPIO_PORT GPIOA
- #define L298N_ENA_GPIO_CLK RCC_APB2Periph_GPIOA
- #define L298N_ENA_TIM_CLK RCC_APB1Periph_TIM2
- #define L298N_ENA_TIM TIM2
- // PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
- #define L298N_ENA_TIM_PERIOD (1000-1)
- #define L298N_ENA_TIM_PSC (72-1)
- #define L298N_ENA_TIM_PULSE 5000
- void L298N_GPIO_Init(void);
- void L298N_PWM_GPIO_Init(void);
- void PWM_Init(void);
- void MotorA_Dir(uint8_t dir);
- void MotorA_SetSpeed(uint16_t speed);
- #endif
复制代码
bsp_systick.c
- #include "bsp_systick.h"
- #if 0
- static __INLINE uint32_t SysTick_Config(uint32_t ticks)
- {
- if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
-
- SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
- NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
-
- SysTick->VAL = 0; /* Load the SysTick Counter Value */
- SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
- SysTick_CTRL_TICKINT_Msk |
- SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
- return (0); /* Function successful */
- }
- #endif
- void SysTick_Delay_ms(uint32_t ms)
- {
- uint32_t i;
- SysTick_Config(72000);
-
- for(i=0;i<ms;i++)
- {
- while(!((SysTick->CTRL)&(1<<16)));
- }
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- }
- void SysTick_Delay_us(uint32_t us)
- {
- uint32_t i;
- SysTick_Config(72);
-
- for(i=0;i<us;i++)
- {
- while(!((SysTick->CTRL)&(1<<16)));
- }
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- }
复制代码 bsp_systick.h
- #ifndef _BSP_SYSTICK_H_
- #define _BSP_SYSTICK_H_
- #include "stm32f10x.h"
- #include "core_cm3.h"
- void SysTick_Delay_ms(uint32_t ms);
- void SysTick_Delay_us(uint32_t us);
- #endif
复制代码
|
|