找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32定时器3四路PWM输出驱动l9110s电机 源程序

[复制链接]
跳转到指定楼层
楼主
ID:421049 发表于 2019-7-27 01:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32驱动l9110s,定时器3四路PWM输出,pwm范围为-899至899,可正反转。

单片机源程序如下:
  1. #include "L9110.h"
  2. #include "usart.h"
  3. #include "led.h"


  4. //通用定时器3中断初始化
  5. //这里时钟选择为APB1的2倍,而APB1为36M
  6. //arr:自动重装值。
  7. //psc:时钟预分频数
  8. //这里使用的是定时器3!
  9. void TIM3_Int_Init(u16 arr,u16 psc)
  10. {
  11.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  12.         NVIC_InitTypeDef NVIC_InitStructure;

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

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

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

  25.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
  26.                                                          
  27. }
  28. //定时器3中断服务程序
  29. void TIM3_IRQHandler(void)   //TIM3中断
  30. {
  31.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
  32.                 {
  33.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
  34.                 LED1=!LED1;
  35.                 }
  36. }

  37. //TIM3 PWM部分初始化
  38. //PWM输出初始化
  39. //arr:自动重装值
  40. //psc:时钟预分频数
  41. void TIM3_PWM_Init(u16 arr,u16 psc)
  42. {  
  43.         GPIO_InitTypeDef GPIO_InitStructure;
  44.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  45.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  46.         

  47.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  48.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  |  RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设功能模块时钟
  49.          

  50.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOA.6,7
  51.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM_CH2,TIM_CH1
  52.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  53.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  54.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
  55.         
  56.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM_CH3,TIM_CH4
  57.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  58.    //初始化TIM3
  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(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  64.         
  65.         //初始化TIM3 四路PWM模式         
  66.         
  67.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  68.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  69.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  70.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1
  71.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
  72.         
  73.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  74.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  75.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  76.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
  77.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
  78.         
  79.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  80.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  81.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  82.         TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC3
  83.         TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR3上的预装载寄存器
  84.         
  85.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  86.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  87.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  88.         TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC4
  89.         TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR4上的预装载寄存器
  90.         
  91.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  92. }



  93. void L9110_Init(void)
  94. {

  95. GPIO_InitTypeDef  GPIO_InitStructure;
  96.          
  97. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //使能PC端口时钟
  98.         
  99. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
  100. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  101. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  102. GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5
  103. GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5);                                                 //PB.5 输出高

  104. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                             //LED1-->PE.5 端口配置, 推挽输出
  105. // GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  106. // GPIO_SetBits(GPIOE,GPIO_Pin_5);                                                  //PE.5 输出高
  107. }

  108. void L9100PWM1(vs16 speed1)
  109. {
  110.         if(speed1>=0)
  111.         {
  112.                 MA=0;
  113.                 TIM_SetCompare1(TIM3,speed1);
  114.         }
  115.         else
  116.         {
  117.                 MA=1;
  118.                 speed1=900+speed1;
  119.                 TIM_SetCompare1(TIM3,speed1);
  120.                
  121.         }
  122. }

  123. void L9100PWM2(vs16 speed2)
  124. {
  125.         if(speed2>=0)
  126.         {
  127.                 MB=0;
  128.                 TIM_SetCompare2(TIM3,speed2);
  129.         }
  130.         else
  131.         {
  132.                 MB=1;
  133.                 speed2=900+speed2;
  134.                 TIM_SetCompare2(TIM3,speed2);
  135.                
  136.         }
  137. }

  138. void L9100PWM3(vs16 speed3)
  139. {
  140.         if(speed3>=0)
  141.         {
  142.                 MC=0;
  143.                 TIM_SetCompare3(TIM3,speed3);
  144.         }
  145.         else
  146.         {
  147.                 MC=1;
  148.                 speed3=900+speed3;
  149.                 TIM_SetCompare3(TIM3,speed3);
  150.                
  151.         }
  152. }

  153. void L9100PWM4(vs16 speed4)
  154. {
  155.         if(speed4>=0)
  156.         {
  157.                 MD=0;
  158.                 TIM_SetCompare4(TIM3,speed4);
  159.         }
  160.         else
  161.         {
  162.                 MD=1;
  163.                 speed4=900+speed4;
  164.                 TIM_SetCompare4(TIM3,speed4);
  165.                
  166.         }
  167. }
复制代码

所有资料51hei提供下载:
l9110s.7z (187.15 KB, 下载次数: 150)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:160995 发表于 2019-8-12 15:48 | 只看该作者
好东西呀,谢谢分享,正需要这东西参考
回复

使用道具 举报

板凳
ID:329586 发表于 2021-5-7 23:23 | 只看该作者
本帖最后由 猪不怕壮 于 2021-5-9 00:09 编辑

请教一下怎么停止转动呢?
回复

使用道具 举报

地板
ID:1074289 发表于 2023-4-26 19:21 | 只看该作者
猪不怕壮 发表于 2021-5-7 23:23
请教一下怎么停止转动呢?

直流电机应该是调节占空比控制转速,貌似stm32里TIM_SetCompare这个比较函数里可以设置占空比,还在研究
回复

使用道具 举报

5#
ID:291668 发表于 2023-4-27 13:17 | 只看该作者
对的! 点赞分享。学习参考下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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