打印
[APM32F1]

定时器产生PWM注意点——使能输出比较通x预装载

[复制链接]
573|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjh20070904|  楼主 | 2022-4-17 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#技术资源#
(部分图片见附件,方便采集波形)
1 概述
在调试定时器时,自动重装载缓冲使能、使能输出比较通道 1 预装载、产生更新事件的概念不好理解,经过使能、禁止的对比采集PWM波形,对比这几个寄存器的概念。
2 寄存器功能定义
1)数值类
  
寄存器
  
自动重装载寄存器(TMRx_AUTORLD
寄存器位
自动重装载数值(Auto  Reload Value
  
寄存器
  
通道 1 捕获/比较寄存器(TMRx_CC1
寄存器位
CC1 包含了当前装入捕获/比较寄存器数值
2)控制类
  
寄存器
  
控制寄存器 1TMRx_CTRL1
寄存器位
TMRx_AUTORLD-> ARPEN
  
自动重装载缓冲使能(Auto-reload  Preload Enable
  
寄存器
  
通道x捕获/比较寄存器(TMRx_CCx
寄存器位
TMRx_CCx-> OC1PEN
  
使能输出比较通道 1 预装载(Output Compare Channel1 Preload Enable
  
寄存器
  
控制事件产生寄存器(TMRx_CEG
寄存器位
TMRx_CEG->UEG
  
产生更新事件(Update  Event Generate
3 输出比较通道 1 预装载实验3.1 禁止输出比较通道 1 预装载
  
寄存器数值
  
TMRx_CCx-> OC1PEN =0
关键代码
//TMR_ConfigOC1Preload(TMR1,  TMR_OC_PRELOAD_ENABLE);
现象
会立刻改变占空比
  
                                                                     
3.2 使能输出比较通道 1 预装载
  
寄存器数值
  
TMRx_CCx-> OC1PEN =1
关键代码
TMR_ConfigOC1Preload(TMR1,  TMR_OC_PRELOAD_ENABLE);
现象
会在下一个周期(更新事件)改变占空比,不会立刻改变
  
     
3.3 总结
使能“输出比较通道 1 预装载”时,PWM的占空比会在下一个周期(更新事件)才改变;
禁止“输出比较通道 1 预装载”时,PWM的占空比会立刻改变。
3.4 测试代码
说明:代码中的GPIO翻转用作触发信号,以采集波形
void Trigger_IO_Init(void)
{
   GPIO_Config_T  configStruct;
   RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC);
   configStruct.pin = GPIO_PIN_0;
   configStruct.mode = GPIO_MODE_OUT_PP;
   configStruct.speed = GPIO_SPEED_50MHz;
   GPIO_Config(GPIOC, &configStruct);
}
void SoftDelay(uint32_t counter)
{
     inti=0,j=0;
     for(i=0;i<counter;i++)
     {
         for(j=0;j<100;j++)
         {
              __NOP();__NOP();__NOP();__NOP();__NOP();
         }
     }
}
int main(void)
{
   GPIO_Config_T GPIO_ConfigStruct;
    TMR_BaseConfig_TTMR_TimeBaseStruct;
   TMR_OCConfig_T OCcongigStruct;
     uint32_tpclk1_value=0,pclk2_value;
     
     Trigger_IO_Init();
     
     RCM_ReadPCLKFreq(&pclk1_value,&pclk2_value);
   RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA |RCM_APB2_PERIPH_TMR1 | RCM_APB2_PERIPH_GPIOB));
   GPIO_ConfigStruct.pin = GPIO_PIN_13;
   GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
   GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
   GPIO_Config(GPIOB, &GPIO_ConfigStruct);
   GPIO_ConfigStruct.pin = GPIO_PIN_8;
   GPIO_Config(GPIOA, &GPIO_ConfigStruct);
   TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
   TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
   TMR_TimeBaseStruct.division=720-1;     
   TMR_TimeBaseStruct.period = 10-1;
   TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
     
   OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
   OCcongigStruct.mode = TMR_OC_MODE_PWM1;
   OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
   OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;
   OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
   OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
   OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
   OCcongigStruct.pulse = 3;
   TMR_ConfigOC1(TMR1, &OCcongigStruct);
   //TMR_ConfigOC1Preload(TMR1, TMR_OC_PRELOAD_ENABLE);
     
   TMR_Enable(TMR1);
     TMR_EnablePWMOutputs(TMR1);
     SoftDelay(100);
     TMR_ConfigCompare1(TMR1,8);
     
     GPIO_SetBit(GPIOC,GPIO_PIN_0);  __NOP();__NOP();__NOP();__NOP();__NOP();
     GPIO_ResetBit(GPIOC,GPIO_PIN_0);  __NOP();__NOP();__NOP();__NOP();__NOP();
     
    while(1)
    {
    }
}

定时器产生PWM注意点——使能输出比较通道x预装载.pdf

247.42 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

29

主题

68

帖子

0

粉丝