STM32F103C8+L298NPWM直流电机调速.docx
《STM32F103C8+L298NPWM直流电机调速.docx》由会员分享,可在线阅读,更多相关《STM32F103C8+L298NPWM直流电机调速.docx(11页珍藏版)》请在冰豆网上搜索。
STM32F103C8+L298NPWM直流电机调速
STM32F103C8T6核心板+L298N直流电机调速PWM调速
(一)功能说明
用L298N驱动一台直流减速电机,引脚IN1,IN2可用于PWM控制。
仅用STM32的两个端口给出PWM信号控制IN1,IN2即可实现正反转、加减速等动作。
(二)硬件说明:
控制板:
STM32F03C8T6最小系统;
型号:
STM32F103C8T6
内核:
ARM32位的CortexTM-M3CPU
调试方式:
SWD
尺寸:
×
直流电机驱动板:
L298N是SGS公司的产品,比较常见的是15脚MulTIwatt封装的L298N,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
(三)资源配置:
STM32F03C8T6使用端口定义
端口
功能说明
配置
PA2
连接L298N芯片的IN1
通用定时器的PWM功能,
TIM2_CH3
PA3
连接L298N芯片的IN2
通用定时器的PWM功能,
TIM2_CH4
PC13
控制板带的LED指示灯,周期性的变化,每变化一次,电机的转运方向变化一次。
由TIM3中断定时控制。
通用定时器TIM3定时中断
L298N端口定义
IN1
IN2
ENA
电机状态
PA2
0
始终是1
顺时针运转,调整PA2的频率,可高速。
0
PA3
始终是1
逆时针运转,调整PA2的频率,可高速。
0
0
始终是1
停止
(四)软件实现
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)
⑥编写中断服务函数。
TIMxIRQHandler();
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模拟软件的LogicAnalyzer功能,PA2,PA3,PC13的波形图如下所示:
(五)附录:
程序源码
1#include""
2#include""
3#include""
4
5voidGPIO_Config(void)//配置PA2,PA3
6{
7GPIO_InitTypeDefGPIO_InitStructure;
8
9/*GPIOAclockenable*/
10RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOC,ENABLE);//
11
12/*GPIOAConfiguration:
TIM3channel1and2asalternatefunction
push-pull*/
13=GPIO_Pin_2|GPIO_Pin_3;
14=GPIO_Mode_AF_PP;//
复用推挽输出
15=GPIO_Speed_50MHz;
16GPIO_Init(GPIOA,&GPIO_InitStructure);
17
18=GPIO_Pin_13;//LED0-->
端口配置
19=GPIO_Mode_Out_PP;//推挽输出
20=GPIO_Speed_50MHz;//IO口速度为50MHz
21GPIO_Init(GPIOC,&GPIO_InitStructure);
//根据设定参数初始化
22}
23
24intmain(void)
25{
26delay_init();//延时函数初始化
27NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//设置NVIC中断分组2:
2位抢占优先级,2位响应优先级
28
29//每隔5s的周期,变换电机的转向。
30//定时中断,最小单位钟频率=72MHz/36KHz=2KHz
31TIM3_Int_Init(9999,35999);
32
33GPIO_Config();//LED,PWM端口初始化,配置PC13,PA2,PA3
34TIM2_PWM_Init(47999,2);//分频。
最小单位钟频率=/(2+1)=24Mhz
35
36while
(1)
37{
38
39}
40}
1#include""
2
3//通用定时器3中断初始化
4//这里时钟选择为APB1的2倍,而APB1为36M
5//arr:
自动重装值。
6//psc:
时钟预分频数
7//这里使用的是定时器3!
8
9#definePC13PCout(13)//PC13
10
11voidTIM3_Int_Init(u16arr,u16psc)
12{
13TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
14NVIC_InitTypeDefNVIC_InitStructure;
15
16RCC_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向上计数模式
24TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
25
26TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//使能指定的TIM3中断,允许更新中断
27
28=TIM3_IRQn;//TIM3中断
29=0;
//先占优先级0级
30=3;//从优先级3级
31=ENABLE;//IRQ通道被使能
32NVIC_Init(&NVIC_InitStructure);
//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
33
34TIM_Cmd(TIM3,ENABLE);//使能TIMx外设
35}
36//定时器3中断服务程序
37voidTIM3_IRQHandler(void)//TIM3中断
38{
39if(TIM_GetITStatus(TIM3,TIM_IT_Update)!
=RESET)
//检查指定的TIM中断发生与否:
TIM中断源
40{
41TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
//清除TIMx的中断待处理位:
TIM中断源
42PC13=!
PC13;
43
44if(PC13==1)
45{
46TIM_SetCompare3(TIM2,24000);
47TIM_SetCompare4(TIM2,0);
C:
\STM32F103C8T6核心板+L298N_PWM直流电机调速\HARDWARE\TIMER\
48}
49else
50{
51TIM_SetCompare3(TIM2,0);
52TIM_SetCompare4(TIM2,24000);
53}
54}
55}
56
57//TIM2PWM部分初始化两个PWM波形,分别控制电机的正转与反转
58//PWM输出初始化
59//arr:
自动重装值
60//psc:
时钟预分频数
61voidTIM2_PWM_Init(u16arr,u16psc)
62{
63
64TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
65TIM_OCInitTypeDefTIM_OCInitStructure;
66
67RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能定时器3时钟
68
69//初始化TIM2
70=arr;
//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
71=psc;
//设置用来作为TIMx时钟频率除数的预分频值
72=0;//设置时钟分割:
TDTS=
Tck_tim
73=TIM_CounterMode_Up;
//TIM向上计数模式
74TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
75
76//初始化TIM2Channel1PWM模式
77=TIM_OCMode_PWM1;
//选择定时器模式:
TIM脉冲宽度调制模式2
78=TIM_OutputState_Enable;
//比较输出使能
79=13500;
80=TIM_OCPolarity_High;
//输出极性:
TIM输出比较极性高
81TIM_OC3Init(TIM2,&TIM_OCInitStructure);
//根据T指定的参数初始化外设TIM2OC4
82TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
//使能TIM2在CCR2上的预装载寄存器
83
84//初始化TIM2Channel2PWM模式
85=TIM_OCMode_PWM1;
//选择定时器模式:
TIM脉冲宽度调制模式2
86=TIM_OutputState_Enable;
//比较输出使能
87=0;
88=TIM_OCPolarity_High;
//输出极性:
TIM输出比较极性高
89TIM_OC4Init(TIM2,&TIM_OCInitStructure);
//根据T指定的参数初始化外设TIM2OC4
90TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
//使能TIM2在CCR2上的预装载寄存器
C:
\STM32F103C8T6核心板+L298N_PWM直流电机调速\HARDWARE\TIMER\
91
92TIM_ARRPreloadConfig(TIM2,ENABLE);
93TIM_Cmd(TIM2,ENABLE);//使能TIM2
94
95}
96