查看: 6981|回复: 9

GD32F190定时器的使用-PWM占空比的调节

[复制链接]
  • TA的每日心情
    奋斗
    2023-6-27 14:09
  • 签到天数: 943 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-6-4 17:53:52 | 显示全部楼层 |阅读模式
    分享到:
    收到小红版GD32F190后一直没有发帖分享,最近比较懒!。。。学习190的板子也还是老套路,先是建立一个模板工程,之后点灯……这些都没有什么难度,就不发帖子了。需要注意的是190的结构和STM32还是有点区别的,时钟的设置略有差别。这次想拿小红板用来控制电机,因此PWM是必不可少的。由于没有示波器,就拿LED用来验证占空比是否改变。
    以下是定时器2的初始化设置部分代码:

    另外,在使用小红版的过程中,频繁出现小红板与电脑断开连接的问题,一开始以为是数据线的问题,换过几根数据线后,并没有解决问题,应该是小红版的问题,不知道是否和usbhub芯片的发热有关。
    1. void TIMER_Configuration(void)
    2. {
    3.     /* -----------------------------------------------------------------------
    4.     TIMER2 Configuration: generate 3 PWM signals with 3 different duty cycles:
    5.     TIMER2CLK = SystemCoreClock / 72 = 1MHz

    6.     TIMER2 Channel2 duty cycle = (4000/ 16000)* 100  = 25%
    7.     TIMER2 Channel3 duty cycle = (8000/ 16000)* 100  = 50%
    8.     TIMER2 Channel4 duty cycle = (12000/ 16000)* 100 = 75%
    9.     ----------------------------------------------------------------------- */
    10.           GPIO_InitPara GPIO_InitStructure;
    11.     TIMER_BaseInitPara TIMER_TimeBaseStructure;
    12.     TIMER_OCInitPara  TIMER_OCInitStructure;
    13.           NVIC_InitPara NVIC_InitStructure;

    14.         
    15.           RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOB, ENABLE);
    16.     /* TIMERS clock enable */
    17.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER1|RCC_APB2PERIPH_TIMER15|RCC_APB2PERIPH_TIMER16|RCC_APB2PERIPH_TIMER17,ENABLE);
    18.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2|RCC_APB1PERIPH_TIMER3|RCC_APB1PERIPH_TIMER6|RCC_APB1PERIPH_TIMER14,ENABLE);
    19.    
    20.             /*Configure PB3 PB10 PB11(TIMER2 CH2 CH3 CH4) as alternate function*/
    21.     GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_3|GPIO_PIN_10|GPIO_PIN_11;
    22.     GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF;
    23.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    24.     GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
    25.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PUPD_NOPULL;
    26.     GPIO_Init(GPIOB,&GPIO_InitStructure);

    27.     GPIO_PinAFConfig(GPIOB,GPIO_PINSOURCE3,GPIO_AF_2);
    28.     GPIO_PinAFConfig(GPIOB,GPIO_PINSOURCE10,GPIO_AF_2);
    29.     GPIO_PinAFConfig(GPIOB,GPIO_PINSOURCE11,GPIO_AF_2);
    30.     /* TIMER2  configuration */
    31.     TIMER_DeInit(TIMER2);
    32.     TIMER_TimeBaseStructure.TIMER_Prescaler     = 71;
    33.     TIMER_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
    34.     TIMER_TimeBaseStructure.TIMER_Period        = 15999;
    35.     TIMER_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
    36.     TIMER_BaseInit(TIMER2,&TIMER_TimeBaseStructure);
    37.                
    38.                 TIMER_INTConfig(TIMER2,TIMER_INT_UPDATE,ENABLE);

    39.     /* CH2,CH3 and CH4 Configuration in PWM mode */
    40.     TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
    41.     TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
    42.     TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;

    43.     TIMER_OCInitStructure.TIMER_Pulse = 39;
    44.     TIMER_OC2_Init(TIMER2, &TIMER_OCInitStructure);
    45.     TIMER_OC2_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

    46.     TIMER_OCInitStructure.TIMER_Pulse = 79;
    47.     TIMER_OC3_Init(TIMER2, &TIMER_OCInitStructure);
    48.     TIMER_OC3_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

    49.     TIMER_OCInitStructure.TIMER_Pulse = 119;
    50.     TIMER_OC4_Init(TIMER2, &TIMER_OCInitStructure);
    51.     TIMER_OC4_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

    52.     /* Auto-reload preload enable */
    53.     TIMER_CARLPreloadConfig(TIMER2,ENABLE);
    54.     /* TIMER enable counter*/
    55.     TIMER_Enable( TIMER2, ENABLE );
    56.                
    57.                 NVIC_PRIGroup_Enable(NVIC_PRIGROUP_1);
    58.                
    59.                 NVIC_InitStructure.NVIC_IRQ=TIMER2_IRQn;
    60.                 NVIC_InitStructure.NVIC_IRQPreemptPriority=0;
    61.                 NVIC_InitStructure.NVIC_IRQSubPriority=1;
    62.                 NVIC_InitStructure.NVIC_IRQEnable=ENABLE;
    63.                
    64.                 NVIC_Init(&NVIC_InitStructure);
    65.                
    66.                
    67. }
    复制代码
    实验中使用两个用户按键对占空比进行调节,为了让先是效果比较显著,调节的步长比较大。
    1. void  EXIT_Init(void)
    2. {

    3.   GPIO_InitPara GPIO_InitStructure;
    4.         EXTI_InitPara EXTI_InitStructure;
    5.         NVIC_InitPara NVIC_InitStructure;
    6.         
    7.         RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB,ENABLE);
    8.         
    9.         
    10.         GPIO_InitStructure.GPIO_Pin=GPIO_PIN_6;
    11.         GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN;
    12.         GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
    13.         GPIO_Init(GPIOB,&GPIO_InitStructure);
    14.         
    15.         GPIO_InitStructure.GPIO_Pin=GPIO_PIN_6;
    16.         GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN;
    17.         GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
    18.         GPIO_Init(GPIOB,&GPIO_InitStructure);
    19.         
    20.         GPIO_InitStructure.GPIO_Pin=GPIO_PIN_7;
    21.         GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN;
    22.         GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
    23.         GPIO_Init(GPIOB,&GPIO_InitStructure);        

    24.   RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_CFG,ENABLE);
    25.         
    26.         SYSCFG_EXTILine_Config(EXTI_SOURCE_GPIOB,EXTI_SOURCE_PIN6);
    27.         SYSCFG_EXTILine_Config(EXTI_SOURCE_GPIOB,EXTI_SOURCE_PIN7);
    28.         
    29.         EXTI_InitStructure.EXTI_LINE=EXTI_LINE6;
    30.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    31.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    32.         EXTI_InitStructure.EXTI_LINEEnable=ENABLE;
    33.         EXTI_Init(&EXTI_InitStructure);
    34.         EXTI_ClearIntBitState(EXTI_LINE6);
    35.         
    36.         EXTI_InitStructure.EXTI_LINE=EXTI_LINE7;
    37.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    38.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    39.         EXTI_InitStructure.EXTI_LINEEnable=ENABLE;
    40.         EXTI_Init(&EXTI_InitStructure);
    41.         EXTI_ClearIntBitState(EXTI_LINE7);
    42.         
    43.         NVIC_PRIGroup_Enable(NVIC_PRIGROUP_1);
    44.         
    45.         
    46.         NVIC_InitStructure.NVIC_IRQ=EXTI4_15_IRQn;
    47.         NVIC_InitStructure.NVIC_IRQPreemptPriority=0;
    48.         NVIC_InitStructure.NVIC_IRQSubPriority=0;
    49.         NVIC_InitStructure.NVIC_IRQEnable=ENABLE;
    50.         NVIC_Init(&NVIC_InitStructure);
    51.         

    52. }

    53. int KEY_SCAN(void)
    54. {
    55.         int count=0xfff;
    56.         
    57.         if(EXTI_GetIntBitState(EXTI_LINE6)!=RESET)
    58.         {
    59.         while(count--)
    60.                 ;
    61.          if(EXTI_GetIntBitState(EXTI_LINE6)!=RESET)
    62.          {
    63.           EXTI_ClearIntBitState(EXTI_LINE6);
    64.                 return 1;
    65.          }
    66.   }
    67.          
    68.          
    69.          if(EXTI_GetIntBitState(EXTI_LINE7)!=RESET)
    70.         {
    71.         while(count--)
    72.                 ;
    73.          if(EXTI_GetIntBitState(EXTI_LINE7)!=RESET)
    74.          {
    75.           EXTI_ClearIntBitState(EXTI_LINE7);
    76.                 return 2;
    77.          }
    78.         }
    79.                 return 0;
    80. }


    81. void EXTI4_15_IRQHandler(void)
    82. {
    83.         unsigned int temp=15999;
    84.   int key;
    85.         key=KEY_SCAN();
    86.         if(key==1)
    87.         {
    88.           t+=500;
    89.                 if(t>=16000)
    90.                         t=15999;
    91.                 TIMER_Compare3Config( TIMER2, t);
    92.         }
    93.         if(key==2)
    94.         {
    95.    t-=500;
    96.                 if(t<=500)
    97.                         t=500;
    98.                 TIMER_Compare3Config( TIMER2, t);
    99.         }
    100. }
    复制代码

    PWM.zip

    252.49 KB, 下载次数: 60

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-6-7 11:25:36 | 显示全部楼层
    真不错,赞一个!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-29 09:22
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2016-6-13 23:16:32 | 显示全部楼层
    不错,赞一个,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-7-14 10:15
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-6-17 12:49:28 | 显示全部楼层
    这个是驱动步进电机的?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-6-27 14:09
  • 签到天数: 943 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2016-6-17 18:07:26 | 显示全部楼层
    trochili 发表于 2016-6-17 12:49
    这个是驱动步进电机的?

    实验室有几套步进电机和控制器,就想试试,只不过,那套控制器,控制起来比较简单,频率控制速度,高低电平控制方向,并不用调占空比,给方波信号就行。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-6-29 09:11:22 | 显示全部楼层
    文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-6-29 09:13:54 | 显示全部楼层
    刚刚接触,刚好来学习学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-6-22 11:10
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2016-8-7 23:07:00 | 显示全部楼层
    精华帖,顶                        
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-12-7 12:35
  • 签到天数: 1354 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-11-21 23:13:39 | 显示全部楼层
    下载下来,参考和学习。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:21
  • 签到天数: 183 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-12-3 14:31:01 | 显示全部楼层
    谢谢分享                     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 15:36 , Processed in 0.192494 second(s), 35 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.