你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103的PWM电机控制

[复制链接]
STMCU小助手 发布时间:2021-7-16 16:18
使用pwm输出是首先要看,那个引脚使用可以使用pwm输出。
高级控制和通用定时器通道引脚分布
微信截图_20210716161441.png
选择TIM5CH2
1、GPIO配置输出
  1. <font face="微软雅黑" size="3">static void TIM_GPIO_Config(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;

  4.   // 输出比较通道1 GPIO 初始化
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  6.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  8.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  10. }
  11. </font>
复制代码
2、定时器配置
  1. <font face="微软雅黑" size="3">
  2. /************通用定时器TIM参数定义,只限TIM2、3、4、5************/
  3. // 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
  4. // 我们这里默认使用TIM5

  5. #define            GENERAL_TIM                   TIM5
  6. #define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
  7. #define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM5

  8. // TIM5 输出比较通道2
  9. #define            GENERAL_TIM_CH2_GPIO_CLK      RCC_APB2Periph_GPIOA
  10. #define            GENERAL_TIM_CH2_PORT          GPIOA
  11. #define            GENERAL_TIM_CH2_PIN           GPIO_Pin_1
  12. ////////////////////////////////////////



  13. //5khz
  14. #define            GENERAL_TIM_Period        (20-1)        //计数个数ARR
  15. #define            GENERAL_TIM_Prescaler   (720-1)           //周期 分频数PSC
  16. // 占空比配置
  17. uint16_t CCR1_Val = 10;
  18. static void TIM_Mode_Config(void)
  19. {
  20.       // 开启定时器时钟,即内部时钟CK_INT=72M
  21.       GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

  22.       /*--------------------时基结构体初始化-------------------------*/
  23.       /*--------------------定时器基本配置-------------------------*/
  24.       // 配置周期,这里配置为XXK

  25.       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  26.       // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  27.       TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;       
  28.       // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  29.       TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;       
  30.       // 时钟分频因子 ,配置死区时间时需要用到
  31.       TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  32.       // 计数器计数模式,设置为向上计数
  33.       TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  34.       // 重复计数器的值,没用到不用管
  35.       TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
  36.       // 初始化定时器
  37.       TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

  38.       /*--------------------输出比较结构体初始化-------------------*/       
  39.       /*--------------------PWM输出配置-------------------*/       

  40.       TIM_OCInitTypeDef  TIM_OCInitStructure;
  41.       // 配置为PWM模式1
  42.       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  43.       // 输出使能
  44.       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  45.       // 输出通道电平极性配置       
  46.       TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  47.       // 输出通道空闲电平极性配置
  48.       TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;       
  49.       // 输出比较通道 2
  50.       TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  51.       TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
  52.       TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);


  53.       // 使能计数器
  54.       TIM_Cmd(GENERAL_TIM, ENABLE);

  55.       // 主输出使能,当使用的是通用定时器时,这句不需要
  56.       //TIM_CtrlPWMOutputs(GENERAL_TIM, ENABLE);
  57.      
  58.         
  59. }</font>
复制代码
3、调用函数使用
  1. <font face="微软雅黑" size="3">void PWM_Init(void)
  2. {
  3.         TIM_GPIO_Config();
  4.         TIM_Mode_Config();
  5.         //外面使用这个控制函数控制占空比
  6.         //TIM_SetCompare2(GENERAL_TIM , 70);
  7. }


  8. void pwm_test(void)
  9. {
  10.   
  11.         GPIO_ResetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);
  12.             TIM_SetCompare2(GENERAL_TIM , 5);  
  13.         Delay_s(4);
  14.         GPIO_SetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);         
  15.         Delay_s(2);
  16.         

  17.         GPIO_ResetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);
  18.             TIM_SetCompare2(GENERAL_TIM , 15);  
  19.         Delay_s(4);
  20.         GPIO_SetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);         
  21.         Delay_s(2);


  22. }</font>
复制代码
初次易错点:
1,没有注意到相应的输出比较通道。使用的是ch2,但是函数调用的却是ch1的
TIM_SetCompare1/TIM_SetCompare2/TIM_SetCompare3/TIM_SetCompare4
TIM_OC1Init/TIM_OC2Init/TIM_OC3Init/TIM_OC4Init
TIM_OC1PreloadConfig/TIM_OC2PreloadConfig/TIM_OC3PreloadConfig/TIM_OC4PreloadConfig
2、pwm更改占空比
#define GENERAL_TIM_Period (20-1) //计数个数ARR
             // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
#define GENERAL_TIM_Prescaler (720-1) //周期分频数PSC
             // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
TIM_Period:定时器周期,实际就是设定自动重载寄存器 ARR 的值, ARR 为要装载到实际自动重载寄存器(即影子寄存器) 的值,可设置范围为 0 至 65535。

TIM_Pulse:比较输出脉冲宽度,实际设定比较寄存器 CCR 的值,决定脉冲宽度。可设置范围为 0 至 65535。
2.png

TIM_SetCompare(TIMx,CCRx);设置pwm占空比

收藏 1 评论1 发布时间:2021-7-16 16:18

举报

1个回答
QQSnow 回答时间:2021-7-17 20:28:43
学习学习
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版