找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25185|回复: 35
打印 上一主题 下一主题
收起左侧

STM32F103C8T6+L298N直流电机调速PWM调速程序与波形图等资料

  [复制链接]
跳转到指定楼层
楼主
制作出来的实物图如下:

(一)             功能说明
        L298N驱动一台直流减速电机,引脚IN1IN2可用于PWM控制。仅用STM32的两个端口给出PWM信号控制IN1IN2即可实现正反转、加减速等动作。
(二)             硬件说明:
控制板:STM32F03C8T6最小系统;

控制板说明
型号:
STM32F103C8T6
内核:
ARM 32位的CortexTM-M3  CPU
调试方式:
SWD
尺寸:
22.86mm×53.34mm

直流电机驱动板:L298NSGS公司的产品,比较常见的是15MulTIwatt封装的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:通用定时器TIM2Channel1Channel2PWM实现步骤
         使能定时器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功能,PA2PA3,PC13的波形图如下所示:

(五)             附录:程序源码
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "timer.h"

  4. void GPIO_Config(void)  //配置PA2, PA3
  5. {
  6.   GPIO_InitTypeDef GPIO_InitStructure;

  7.   /* GPIOA  clock enable */
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE);  //

  9.   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  10.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出
  12.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.         
  15.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                                 //LED0-->PC.13 端口配置
  16.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  17.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  18.          GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOC.13         
  19. }

  20. int main(void)
  21. {               
  22.                 delay_init();                     //延时函数初始化         
  23.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  24.          
  25.                 //每隔5s的周期,变换电机的转向。
  26.                 //定时中断,最小单位钟频率=72MHz/36KHz=2KHz
  27.                 TIM3_Int_Init(9999,35999) ;  
  28.          
  29.     GPIO_Config();         //LED,PWM端口初始化,配置PC13,PA2,PA3         
  30.                 TIM2_PWM_Init(47999,2 );         //分频。最小单位钟频率=72000000/(2+1)=24Mhz

  31.            while(1)
  32.                 {
  33.                         
  34.                 }         
  35. }

复制代码

timer.c
  1. #include "timer.h"

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

  7. #define PC13 PCout(13)// PC13        

  8. void TIM3_Int_Init(u16 arr,u16 psc)
  9. {
  10.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  11.         NVIC_InitTypeDef NVIC_InitStructure;

  12.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  13. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE );
  14. //        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3  ,ENABLE);
  15.         
  16.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
  17.         TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
  18.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  19.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  20.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

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

  22.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  23.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  24.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  25.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  26.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  27.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设                                                           
  28. }
  29. //定时器3中断服务程序
  30. void TIM3_IRQHandler(void)   //TIM3中断
  31. {
  32.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
  33.                 {
  34.                         TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
  35.                         PC13=!PC13;     
  36.                         
  37.                         if (PC13 ==1)
  38.                         {        
  39.                                 TIM_SetCompare3(TIM2,24000);
  40.                                 TIM_SetCompare4(TIM2,0);               
  41.                         }
  42.                         else
  43.                         {
  44.                                 TIM_SetCompare3(TIM2,0);
  45.                                 TIM_SetCompare4(TIM2,24000);                        
  46.                         }                                       
  47.                 }
  48. }

  49. //TIM2 PWM部分初始化    两个PWM波形,分别控制电机的正转与反转
  50. //PWM输出初始化
  51. //arr:自动重装值
  52. //psc:时钟预分频数
  53. void TIM2_PWM_Init(u16 arr,u16 psc)
  54. {  

  55.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  56.         TIM_OCInitTypeDef  TIM_OCInitStructure;        

  57.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器3时钟

  58.    //初始化TIM2
  59.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  60.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  61.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  62.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  63.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  64.         
  65.         //初始化TIM2 Channel1 PWM模式
  66.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  67.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  68.         TIM_OCInitStructure.TIM_Pulse = 13500 ;
  69.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  70.         TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC4
  71.         TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2上的预装载寄存器
  72.          
  73.         //初始化TIM2 Channel2 PWM模式         
  74.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  75.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  76.         TIM_OCInitStructure.TIM_Pulse = 0;
  77.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  78.         TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC4
  79.         TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2上的预装载寄存器

  80.   TIM_ARRPreloadConfig(TIM2, ENABLE);
  81.         TIM_Cmd(TIM2, ENABLE);  //使能TIM2            

  82. }
复制代码



全部资料51hei下载地址:
STM32F103C8T6核心板+L298N_PWM直流电机调速.rar (3.36 MB, 下载次数: 1185)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏28 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:421308 发表于 2019-7-23 15:44 | 只看该作者
这个速度没有变化啊,只是正反转了
回复

使用道具 举报

板凳
ID:393077 发表于 2018-11-30 17:27 | 只看该作者
谢谢分享,很帮的应用!学习了!但是程序还是有问题的
回复

使用道具 举报

地板
ID:470100 发表于 2019-1-18 13:12 | 只看该作者
谢谢大佬的分享!多多学习
回复

使用道具 举报

5#
ID:470219 发表于 2019-1-18 16:24 | 只看该作者
大佬好厉害啊
回复

使用道具 举报

6#
ID:476214 发表于 2019-3-3 09:35 | 只看该作者
谢谢大佬
回复

使用道具 举报

7#
ID:494311 发表于 2019-3-19 21:50 | 只看该作者
向大佬学习了
回复

使用道具 举报

8#
ID:149451 发表于 2019-3-27 19:09 | 只看该作者
嘿嘿 ,,,这些硬件手上都有,改天学着玩玩
回复

使用道具 举报

9#
ID:245405 发表于 2019-4-9 17:04 | 只看该作者
电池是什么型号的啊?
回复

使用道具 举报

10#
ID:515799 发表于 2019-5-5 16:25 | 只看该作者
谢谢分享
回复

使用道具 举报

11#
ID:421308 发表于 2019-5-27 16:09 | 只看该作者
谢谢大佬
回复

使用道具 举报

12#
ID:583304 发表于 2019-7-17 21:48 | 只看该作者
学习学习 厉害
回复

使用道具 举报

13#
ID:421308 发表于 2019-7-22 10:38 | 只看该作者
学习学习
回复

使用道具 举报

14#
ID:476510 发表于 2019-7-24 09:33 | 只看该作者
你好 想请问一下 减速电机的电压最大是多少
回复

使用道具 举报

15#
ID:591585 发表于 2019-7-29 20:18 | 只看该作者
请问main函数中while(1)中怎么没有控制程序呢?
回复

使用道具 举报

16#
ID:592118 发表于 2019-7-30 17:26 | 只看该作者
很感谢,目前正在学习
回复

使用道具 举报

17#
ID:160995 发表于 2019-8-6 17:46 | 只看该作者
谢谢分享,很帮的应用!学习了!
回复

使用道具 举报

18#
ID:282095 发表于 2019-8-6 20:21 | 只看该作者
PWM不就是利用高电平调节占空比吗
回复

使用道具 举报

19#
ID:591206 发表于 2019-10-6 17:51 | 只看该作者
谢谢你的无私奉献 老哥加油
回复

使用道具 举报

20#
ID:122260 发表于 2019-10-6 20:04 | 只看该作者
好资料  谢谢大师分享
回复

使用道具 举报

21#
ID:361825 发表于 2019-10-12 21:15 | 只看该作者
楼主辛苦,涨知识了
回复

使用道具 举报

22#
ID:486536 发表于 2019-10-27 13:05 | 只看该作者
这个速度没有变化啊
回复

使用道具 举报

23#
ID:630894 发表于 2019-10-27 14:40 | 只看该作者
挺好
回复

使用道具 举报

24#
ID:486536 发表于 2019-10-28 16:18 | 只看该作者
为什么速度没有变化呢
回复

使用道具 举报

25#
ID:486536 发表于 2019-10-28 16:30 | 只看该作者
终于知道为什么不能调速啦,PWM波需要在程序中修改
回复

使用道具 举报

26#
ID:713590 发表于 2020-3-22 19:36 | 只看该作者
pc13没有接线
回复

使用道具 举报

27#
ID:786480 发表于 2020-7-2 00:39 | 只看该作者

大佬你好吖,我刚注册,有一部分调试不出来,可不可以分享一下吖~谢谢你咯!
回复

使用道具 举报

28#
ID:890487 发表于 2021-3-10 19:01 | 只看该作者
很有用的应用!学习了!
回复

使用道具 举报

29#
ID:890487 发表于 2021-3-13 13:28 | 只看该作者
看了 楼主的代码有点迷茫 请教一下现在是5S 那如果500秒需要改动哪里 时间怎么计算
回复

使用道具 举报

30#
ID:831233 发表于 2021-9-29 15:54 | 只看该作者
SLfass 发表于 2019-4-9 17:04
电池是什么型号的啊?

18650就行
回复

使用道具 举报

31#
ID:752403 发表于 2022-7-22 14:30 | 只看该作者
谢谢,大佬的无私分享,正在找PWM控制程序呢,
回复

使用道具 举报

32#
ID:1085113 发表于 2023-6-29 11:44 | 只看该作者
爱吃鱼的人 发表于 2019-10-28 16:30
终于知道为什么不能调速啦,PWM波需要在程序中修改

哥哥,咋实现调速呀
回复

使用道具 举报

33#
ID:1087287 发表于 2023-7-5 10:01 | 只看该作者
正好需要搞这个,赞
回复

使用道具 举报

34#
ID:1087287 发表于 2023-7-5 11:36 | 只看该作者
为什么我的都不动啊
回复

使用道具 举报

35#
ID:1055873 发表于 2023-7-13 17:28 | 只看该作者
好!向大佬学习了
回复

使用道具 举报

36#
ID:861056 发表于 2024-5-9 15:39 | 只看该作者
木土卫康123 发表于 2019-7-29 20:18
请问main函数中while(1)中怎么没有控制程序呢?

应该都在中断中控制了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表