STM32F103C8+L298N_PWM直流电机调速共7页.doc
如有侵权,请联系网站删除,仅供学习与交流STM32F103C8+L298N_PWM直流电机调速【精品文档】第 7 页STM32F103C8T6核心板+L298N直流电机调速PWM调速(一) 功能说明 用L298N驱动一台直流减速电机,引脚IN1,IN2可用于PWM控制。仅用STM32的两个端口给出PWM信号控制IN1,IN2即可实现正反转、加减速等动作。(二) 硬件说明:控制板:STM32F03C8T6最小系统;控制板说明型号:STM32F103C8T6内核:ARM 32位的CortexTM-M3 CPU调试方式:SWD尺寸:22.86mm×53.34mm直流电机驱动板:L298N是SGS公司的产品,比较常见的是15脚MulTIwatt封装的L298N,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。(三) 资源配置: STM32F03C8T6使用端口定义端口功能说明配置PA2连接L298N芯片的IN1 通用定时器的PWM功能, TIM2_CH3PA3连接L298N芯片的IN2通用定时器的PWM功能,TIM2_CH4PC13控制板带的LED指示灯,周期性的变化,每变化一次,电机的转运方向变化一次。由TIM3中断定时控制。通用定时器TIM3定时中断L298N端口定义 IN1IN2ENA电机状态PA20始终是1顺时针运转,调整PA2的频率,可高速。 0PA3始终是1逆时针运转,调整PA2的频率,可高速。00始终是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) 编写中断服务函数。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_InitStructure.GPIO_Mode = 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 "delay.h"2 #include "sys.h"3 #include "timer.h"45 void GPIO_Config(void) /配置PA2, PA36 7 GPIO_InitTypeDef GPIO_InitStructure;89 /* GPIOA clock enable */10 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC,ENABLE); /1112 /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate functionpush-pull */13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出15 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;16 GPIO_Init(GPIOA, &GPIO_InitStructure);1718 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; /LED0->PC.13端口配置19 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出20 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度为50MHz21 GPIO_Init(GPIOC, &GPIO_InitStructure);/根据设定参数初始化GPIOC.1322 2324 int main(void)25 26 delay_init(); /延时函数初始化27 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/设置NVIC中断分组2:2位抢占优先级,2位响应优先级2829 /每隔5s的周期,变换电机的转向。30 /定时中断,最小单位钟频率=72MHz/36KHz=2KHz31 TIM3_Int_Init(9999,35999) ;3233 GPIO_Config(); /LED,PWM端口初始化,配置PC13,PA2,PA334 TIM2_PWM_Init(47999,2 ); /分频。最小单位钟频率=72000000/(2+1)=24Mhz3536 while(1)37 3839 40 1 #include "timer.h"23 /通用定时器3中断初始化4 /这里时钟选择为APB1的2倍,而APB1为36M5 /arr:自动重装值。6 /psc:时钟预分频数7 /这里使用的是定时器3!89 #define PC13 PCout(13)/ PC131011 void TIM3_Int_Init(u16 arr,u16 psc)12 13 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;14 NVIC_InitTypeDef NVIC_InitStructure;1516 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /时钟使能17 / RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE );18 / GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 ,ENABLE);1920 TIM_TimeBaseStructure.TIM_Period = arr;/设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms21 TIM_TimeBaseStructure.TIM_Prescaler = psc;/设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率22 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;/设置时钟分割:TDTS = Tck_tim23 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;/TIM向上计数模式24 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位2526 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );/使能指定的TIM3中断,允许更新中断2728 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /TIM3中断29 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/先占优先级0级30 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /从优先级3级31 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ通道被使能32 NVIC_Init(&NVIC_InitStructure);/根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器3334 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;4344 if (PC13 =1)45 46 TIM_SetCompare3(TIM2,24000);47 TIM_SetCompare4(TIM2,0);C:STM32F103C8T6核心板+L298N_PWM直流电机调速HARDWARETIMERtimer.c48 49 else50 51 TIM_SetCompare3(TIM2,0);52 TIM_SetCompare4(TIM2,24000);53 54 55 5657 /TIM2 PWM部分初始化两个PWM波形,分别控制电机的正转与反转58 /PWM输出初始化59 /arr:自动重装值60 /psc:时钟预分频数61 void TIM2_PWM_Init(u16 arr,u16 psc)62 6364 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;65 TIM_OCInitTypeDef TIM_OCInitStructure;6667 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /使能定时器3时钟6869 /初始化TIM270 TIM_TimeBaseStructure.TIM_Period = arr;/设置在下一个更新事件装入活动的自动重装载寄存器周期的值71 TIM_TimeBaseStructure.TIM_Prescaler =psc;/设置用来作为TIMx时钟频率除数的预分频值72 TIM_TimeBaseStructure.TIM_ClockDivision = 0; /设置时钟分割:TDTS =Tck_tim73 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;/TIM向上计数模式74 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位7576 /初始化TIM2 Channel1 PWM模式77 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/选择定时器模式:TIM脉冲宽度调制模式278 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/比较输出使能79 TIM_OCInitStructure.TIM_Pulse = 13500 ;80 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/输出极性:TIM输出比较极性高81 TIM_OC3Init(TIM2, &TIM_OCInitStructure);/根据T指定的参数初始化外设TIM2 OC482 TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);/使能TIM2在CCR2上的预装载寄存器8384 /初始化TIM2 Channel2 PWM模式85 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/选择定时器模式:TIM脉冲宽度调制模式286 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/比较输出使能87 TIM_OCInitStructure.TIM_Pulse = 0;88 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/输出极性:TIM输出比较极性高89 TIM_OC4Init(TIM2, &TIM_OCInitStructure);/根据T指定的参数初始化外设TIM2 OC490 TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);/使能TIM2在CCR2上的预装载寄存器C:STM32F103C8T6核心板+L298N_PWM直流电机调速HARDWARETIMERtimer.c9192 TIM_ARRPreloadConfig(TIM2, ENABLE);93 TIM_Cmd(TIM2, ENABLE); /使能TIM29495 96