STM32F103C8+L298N_PWM直流电机调速
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32F103C8T 骸心板+L298N 直流电机调速 PWM 调速 (一)功能说明
用L298N 驱动一台直流减速电机, 引脚IN1 , IN2可用于PWM 控制。
仅用STM32的两个端口给出 PWM 信号控制IN1,IN2即可实现正反转、加减速等动作。
(二 ) 硬件说明:
控制板说明
型号:
STM32F103C8T6 内核:
ARM 32 位的 Cortex TM -M3 CPU 调试方式:
SWD 尺寸:
22.86mm x 53.34mm 直流电机驱动板:L298N 是SGS 公司的产品,比较常见的是
(三)资源配置STM32F03C8T6使用端口定义 端口 功能说明 配置
15脚MulTIwatt 封装的L298N ,内部同样包含 控制板:STM32F03C8T6最小系统;
BOOT 选择
主晶扼
调试摟口
4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电
机。
马达B 输12VffiA 电
源地 5甘揄
出可不接 AiS
道使能一
様载5V 输出使
第 马达A 輪出
(四)软件实现
1:通用定时器TIM3的中断定时实现步骤
①使能定时器时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
②初始化定时器,配置【ARR自动装载值,PSC预分频系数。
】
TIM_TimeBase In it(TIM3, &TIM_TimeBaseStructure);
③开启定时器中断,配置NVIC。
TIM_ITCo nfig(TIM3,TIMl_I T_Update,ENABLE);
NVIC_I nit(&N VIC_I nitStructure);
④使能定时器。
TIM_Cmd(TIM3, ENABLE); // 实际是配置控制寄存器 1 (TIM3_CR1)
⑥ 编写中断服务函数。
TIMx IRQHa ndler();
2:通用定时器TIM2的Channell、Channel2的PWM实现步骤
①使能定时器2和相关10 口时钟。
使能定时器 2 时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
使能GPI0B时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
②初始化10 口为复用功能输出。
函数:GPI0_Init();
GPI0_I ni tStructure.GPIO_Mode = GPIO_Mode_AF_PP;
③初始化定时器:ARR,PSC等: TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
④初始化输出比较参数:
TIM_0C3 In it(TIM2, &TIM_0C In itStructure);
TIM_0C4I nit(TIM2, &TIM_0C In itStructure);
⑤使能预装载寄存器:TIM_0C2PreloadConfig(TIM2, TIM_0CPreload_Enable);
⑥使能定时器。
TIM_Cmd();
⑦不断改变比较值CCRx达到不同的占空比效果:TIM_SetCompare3() ; TIM_SetCompare4(); 使用Keil5模拟软件的Logic Analyzer功能,PA2, PA3,PC13的波形图如下所示:
(五)附录:程序源码
1#i nclude "delay.h"
2#i nclude "sys.h"
3#i nclude "timer.h"
4
4void GPIO_Config(void) // 配置PA2, PA3
5{
6GPIO_I ni tTypeDef GPIO_I nitStructure;
8
7/* GPIOA clock en able */
8RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOC,ENABLE); //
11
9/*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ 10GPIO_I nitStructure.GPIO_Pi n = GPIO_Pin_2 | GPIO_Pin_3;
11GPIO_I ni tStructure.GPIO_Mode = GPIO_Mode_AF_PP; //
复用推挽输出
12GPIO_I nitStructure.GPIO_Speed = GPIO_Speed_5OMH z;
13GPIO_Init(GPIOA, &GPIO_InitStructure);
17
14GPIO_I ni tStructure.GPIO_Pin = GPIO_Pin_13; 〃LED0-->PC.13
端口配置
15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
16GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为50MHz
17GPIO_I nit(GPIOC, & GPIO_I nitStructure);
//根据设定参数初始化GPIOC.13
18}
23
19int main( void)
20{
21delay_init(); //延时函数初始化
22NVIC_PriorityGroupCo nfig(NVIC_PriorityGroup_2);
//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
28
23//每隔5s的周期,变换电机的转向。
24//定时中断,最小单位钟频率=72MHz/36KHz=2KHz
25TIM3_lnt_lnit(9999,35999);
32
26GPIO_Config(); 〃LED,PWM 端口初始化,配置PC13,PA2,PA3
27TIM2_PWM」nit(47999,2 ); // 分频。
最小单位钟频率=72000000/(2+1)=24Mhz
35
28while(1)
29{
38
30}
31}
1#i nclude "timer.h"
2
2//通用定时器3中断初始化
3//这里时钟选择为APB1的2倍,而APB1为36M
4//arr :自动重装值。
5〃psc :时钟预分频数
6//这里使用的是定时器3!
8
7#define PC13 PCout(13)〃PC13
10
8void TIM3_Int_Init(u16 arr,u16 psc)
9{
10TIM_TimeBaseI ni tTypeDef TIM_TimeBaseStructure;
11NVIC_I ni tTypeDef NVIC_I ni tStructure;
15
12RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);时钟使能
13// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE );
14// GPIO_Pi nRemapCo nfig(GPIO_FullRemap_TIM3 ,ENABLE);
19
15TIM_TimeBaseStructure.TIM_Period = arr;
//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
计数到5000为500ms
16TIM_TimeBaseStructure.TIM_Prescaler = psc;
//设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率
17TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置时钟分割:TDTS = Tck_tim
18TIM_TimeBaseStructure.TIM_Cou nterMode = TIM_Cou nterMode_Up;
//TIM向上计数模式
19TIM_TimeBase In it(TIM3, &TIM_TimeBaseStructure);
//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位25
20TIM_ITCo nfig(TIM3,TI M」T_Update,ENABLE );
//使能指定的TIM3中断,允许更新中断
27
21NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 中断
22NVIC_I ni tStructure.NVIC_IRQCha nn elPreemptio nPriority = 0;
//先占优先级0级
23NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 从优先级 3 级24NVIC_I ni tStructure.NVIC_IRQCha nn elCmd = ENABLE; //IRQ 通道被使能25NVIC_I nit(&N VIC_I ni tStructure);
//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
33
26TIM_Cmd(TIM3, ENABLE); //使能TIMx 外设
28//定时器3中断服务程序
29void TIM3_IRQHa ndler(void) //TIM3 中断
30{
31if (TIM_GetlTStatus(TIM3, TIM」T_Update) != RESET)
//检查指定的TIM中断发生与否:TIM中断源
32{
33TIM_ClearITPe ndi ngBit(TIM3, TIM」T_Update );
//清除TIMx的中断待处理位:TIM中断源
34PC13=!PC13;
43
35if (PC13 ==1)
36{
37TIM_SetCompare3(TIM2,24000);
38TIM_SetCompare4(TIM2,0);
C:\STM32F103C8T6核心板+L298N_PWM 直流电机调速\HARDWARE\TIMER\timer.c 39}
40else
41{
42TIM_SetCompare3(TIM2,0);
43TIM_SetCompare4(TIM2,24000);
44}
45}
46}
56
47//TIM2 PWM部分初始化两个PWM波形,分别控制电机的正转与反转
48//PWM输出初始化
49//arr :自动重装值
50//psc :时钟预分频数
51void TIM2_PWM」nit(u16 arr,u16 psc)
52{
63
53TIM_TimeBaseI ni tTypeDef TIM_TimeBaseStructure;
54TIM_OCI nitTypeDef TIM_OCI nitStructure;
66
55RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);使能定时器 3 时钟68
56//初始化TIM2
57TIM_TimeBaseStructure.TIM_Period = arr;
//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
58TIM_TimeBaseStructure.TIM_Prescaler =psc;
//设置用来作为TIMx时钟频率除数的预分频值
59TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 设置时钟分割:TDTS =
60TIM_TimeBaseStructure.TIM_Cou nterMode = TIM_Cou nterMode_Up;
//TIM向上计数模式
61TIM_TimeBase In it(TIM2, &TIM_TimeBaseStructure);
//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
75
62// 初始化TIM2 Channel1 PWM 模式
63TIM_OCI ni tStructure.TIM_OCMode = TIM_OCMode_PWM1;
//选择定时器模式:TIM脉冲宽度调制模式 2
64TIM_OCI nitStructure.TIM_OutputState = TIM_OutputState_E nable;
//比较输出使能
65TIM_OCI ni tStructure.TIM_Pulse = 13500 ;
66TIM_OCI ni tStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//输出极性:TIM输出比较极性高
67TIM_OC3 In it(TIM2, &TIM_OCI nitStructure);
//根据T指定的参数初始化外设TIM2 OC4
68TIM_OC3PreloadCo nfig(TIM2, TIM_OCPreload_E nable);
//使能TIM2在CCR2上的预装载寄存器
83
69// 初始化TIM2 Channel2 PWM 模式
70TIM_OCI ni tStructure.TIM_OCMode = TIM_OCMode_PWM1;
//选择定时器模式:TIM脉冲宽度调制模式 2
71TIM_OCI nitStructure.TIM_OutputState = TIM_OutputState_E nable;
//比较输出使能
72TIM_OCI nitStructure.TIM_Pulse = 0;
73TIM_OCI ni tStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//输出极性:TIM输出比较极性高
74TIM_OC4I nit(TIM2, &TIM_OCI nitStructure);
//根据T指定的参数初始化外设TIM2 OC4
75TIM_OC4PreloadCo nfig(TIM2, TIM_OCPreload_E nable);
//使能TIM2在CCR2上的预装载寄存器
C:\STM32F103C8T6核心板+L298N_PWM 直流电机调速\HARDWARE\TIMER\timer.c 91
76TIM_ARRPreloadCo nfig(TIM2, ENABLE);
77TIM_Cmd(TIM2, ENABLE); //使能TIM2
94
78}
96。