您的当前位置:首页正文

STM32F103C8+L298N_PWM直流电机调速

2020-08-06 来源:易榕旅网
STM32F103C8T6核心板+L298N直流电机调速PWM调速

(一) 功能说明

用L298N驱动一台直流减速电机,引脚IN1,IN2可用于PWM控制。仅用STM32的两个端口给出PWM

信号控制IN1,IN2即可实现正反转、加减速等动作。

(二) 硬件说明:

控制板:STM32F03C8T6最小系统;

型号: 内核: 调试方式: 尺寸: 直流电机驱动板:L298N是SGS公司的产品,比较常见的是15脚MulTIwatt封装的L298N,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。

STM32F103C8T6 ARM 32位的Cortex-M3 CPU SWD × TM

(三) 资源配置:

STM32F03C8T6使用端口定义 端口 PA2 功能说明 连接L298N芯片的IN1 配置 通用定时器的PWM功能, TIM2_CH3 PA3 连接L298N芯片的IN2 通用定时器的PWM功能, TIM2_CH4 PC13 控制板带的LED指示灯,周期性的变化,通用定时器TIM3定时中断 每变化一次,电机的转运方向变化一次。 由TIM3中断定时控制。

L298N端口定义 IN1 PA2 0 0

IN2 0 PA3 0 ENA 始终是1 始终是1 始终是1 电机状态 顺时针运转,调整PA2的频率,可高速。 逆时针运转,调整PA2的频率,可高速。 停止 (四) 软件实现

1:通用定时器TIM3的中断定时实现步骤 ① 使能定时器时钟。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

② 初始化定时器,配置【ARR自动装载值,PSC预分频系数。】 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); ③ 开启定时器中断,配置NVIC。

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); NVIC_Init(&NVIC_InitStructure); ④ 使能定时器。

TIM_Cmd(TIM3, ENABLE); //实际是配置 控制寄存器1 (TIM3_CR1) ⑥ 编写中断服务函数。 TIMx IRQHandler();

2:通用定时器TIM2的Channel1、Channel2的PWM实现步骤 ① 使能定时器2和相关IO口时钟。

使能定时器2时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 使能GPIOB时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ② 初始化IO口为复用功能输出。函数:GPIO_Init(); = GPIO_Mode_AF_PP;

③ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ④ 初始化输出比较参数:

TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC4Init(TIM2, &TIM_OCInitStructure);

⑤ 使能预装载寄存器: TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); ⑥ 使能定时器。TIM_Cmd();

⑦ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare3() ; TIM_SetCompare4() ;

使用Keil5 模拟软件的Logic Analyzer功能,PA2,PA3,PC13的波形图如下所示:

(五) 附录:程序源码

1 #include \"\" 2 #include \"\" 3 #include \"\" 4

5 void GPIO_Config(void) //配置PA2, PA3 6 {

7 GPIO_InitTypeDef GPIO_InitStructure; 8

9 /* GPIOA clock enable */

10 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE); // 11

12 /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */

13 = GPIO_Pin_2 | GPIO_Pin_3; 14 = GPIO_Mode_AF_PP; // 复用推挽输出

15 = GPIO_Speed_50MHz;

16 GPIO_Init(GPIOA, &GPIO_InitStructure); 17

18 = GPIO_Pin_13; //LED0-->

端口配置

19 = GPIO_Mode_Out_PP; //推挽输出 20 = GPIO_Speed_50MHz; //IO口速度为50MHz 21 GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化 22 } 23

24 int main(void) 25 {

26 delay_init(); //延时函数初始化

27 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 28

29 //每隔5s的周期,变换电机的转向。

30 //定时中断,最小单位钟频率=72MHz/36KHz=2KHz 31 TIM3_Int_Init(9999,35999) ; 32

33 GPIO_Config(); //LED,PWM端口初始化,配置PC13,PA2,PA3 34 TIM2_PWM_Init(47999,2 ); //分频。最小单位钟频率=/(2+1)=24Mhz 35

36 while(1) 37 { 38 39 } 40 }

1 #include \"\" 2

3 //通用定时器3中断初始化

4 //这里时钟选择为APB1的2倍,而APB1为36M 5 //arr:自动重装值。 6 //psc:时钟预分频数 7 //这里使用的是定时器3! 8

9 #define PC13 PCout(13)// PC13 10

11 void TIM3_Int_Init(u16 arr,u16 psc) 12 {

13 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 14 NVIC_InitTypeDef NVIC_InitStructure; 15

16 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 17 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE ); 18 // GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 ,ENABLE); 19 20 = arr;

//设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms 21 = psc;

//设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 22 = TIM_CKD_DIV1;

//设置时钟分割:TDTS = Tck_tim 23 = TIM_CounterMode_Up; //TIM向上计数模式

24 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

25

26 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 27

28 = TIM3_IRQn; //TIM3中断 29 = 0; //先占优先级0级 30 = 3; //从优先级3级 31 = ENABLE; //IRQ通道被使能 32 NVIC_Init(&NVIC_InitStructure);

//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 33

34 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 35 }

36 //定时器3中断服务程序

37 void TIM3_IRQHandler(void) //TIM3中断 38 {

39 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 40 {

41 TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 42 PC13=!PC13; 43

44 if (PC13 ==1) 45 {

46 TIM_SetCompare3(TIM2,24000); 47 TIM_SetCompare4(TIM2,0);

C:\\STM32F103C8T6核心板+L298N_PWM直流电机调速\\HARDWARE\\TIMER\\ 48 } 49 else 50 {

51 TIM_SetCompare3(TIM2,0); 52 TIM_SetCompare4(TIM2,24000); 53 } 54 } 55 } 56

57 //TIM2 PWM部分初始化两个PWM波形,分别控制电机的正转与反转 58 //PWM输出初始化 59 //arr:自动重装值 60 //psc:时钟预分频数

61 void TIM2_PWM_Init(u16 arr,u16 psc) 62 { 63

64 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 65 TIM_OCInitTypeDef TIM_OCInitStructure; 66

67 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器3时钟 68

69 //初始化TIM2 70 = arr;

//设置在下一个更新事件装入活动的自动重装载寄存器周期的值 71 =psc;

//设置用来作为TIMx时钟频率除数的预分频值 72 = 0; //设置时钟分割:TDTS =

Tck_tim

73 = TIM_CounterMode_Up; //TIM向上计数模式

74 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 75

76 //初始化TIM2 Channel1 PWM模式 77 = TIM_OCMode_PWM1;

//选择定时器模式:TIM脉冲宽度调制模式2 78 = TIM_OutputState_Enable; //比较输出使能 79 = 13500 ;

80 = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

81 TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 OC4

82 TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 83

84 //初始化TIM2 Channel2 PWM模式 85 = TIM_OCMode_PWM1;

//选择定时器模式:TIM脉冲宽度调制模式2 86 = TIM_OutputState_Enable; //比较输出使能 87 = 0;

88 = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

89 TIM_OC4Init(TIM2, &TIM_OCInitStructure);

//根据T指定的参数初始化外设TIM2 OC4

90 TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器

C:\\STM32F103C8T6核心板+L298N_PWM直流电机调速\\HARDWARE\\TIMER\\ 91

92 TIM_ARRPreloadConfig(TIM2, ENABLE); 93 TIM_Cmd(TIM2, ENABLE); //使能TIM2 94 95 } 96

因篇幅问题不能全部显示,请点此查看更多更全内容