查看: 4061|回复: 1

[原创] 【正点原子号令者RT1052使用】7.RT1052之PWM呼吸灯

[复制链接]
  • TA的每日心情
    擦汗
    2018-8-4 22:53
  • 签到天数: 37 天

    连续签到: 2 天

    [LV.5]常住居民I

    发表于 2018-7-14 18:15:14 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 煮饺子水洗脚 于 2018-7-14 18:29 编辑

    本帖主要来学习QTMR定时器PWM输出的使用。
    本实验,main函数会初始化QTMR4的第4个定时器(QTMR4_CH3,使用GPIO2_IO27),用于输出PWM脉冲,需要拿一根杜邦线连接GPIO2_IO27和GPIO1_IO03,让PWM脉冲来控制DS0的亮度.main函数里面,会自动修改PWM脉宽,从而控制DS0由亮到灭,由灭到亮的循环.


    先看下实验效果吧
    1531563082886mz123.gif

    脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。 RT1052 的 QTMR 定时器支持交替比较模式(CTRLy[OUTMODE]=100, y 表示通道编号,范围: 0~3,下同)生成 PWM,生成过程如图所示:  

    QQ截图20180714181618.jpg

    RT1052 每个 QTMR 定时器有 4 个通道,每个通道可以输出 1 路 PWM,总共有 4 个 QTMR定时器,这样就可以产生 16 路 PWM。




    QTMR4 的通道 3 产生一路 PWM 输出, 要用 QTMR 定时器的某个通产生 PWM 输出,  还需要配置几个除了定时器外 与pwm相关的寄存器:通道状态&控制寄存器(QTMRx_SCTRLy , x 为 QTMR 编号, y 为通道编号, x=0~3, y=0~3,下同)、 通道比较寄存器 2(QTMRx_COMP2y)、 通道比较值预加载寄存器 1(QTMRx_CMPLD1y) 和通道比较值预加载寄存器 2(QTMRx_CMPLD2y)。


    通道状态&控制寄存器寄存器(QTMRx_SCTRLy) :


       QQ截图20180714181852.jpg

    通道状态&控制寄存器寄存器(QTMRx_SCTRLy)

    QQ截图20180714181923.jpg

    通道比较值预加载寄存器 1(QTMRx_CMPLD1y)
    QQ截图20180714181948.jpg

    1.使能 QTMR4 的时钟

    使用函数 CLOCK_EnableClock 使能 QTMR4 时钟,使用方法如下:
    1. CLOCK_EnableClock(kCLOCK_Timer4)
    复制代码

    此函数会被 QTMR 定时器初始化函数 QTMR_Init 调用,所以不需要我们显示的调用。

    2) 初始化 GPIO_B1_11(GPIO2_IO27)。
    因为要输出 PWM 波形,因此需要将 GPIO_B1_11(GPIO2_IO27)设置为 QTMR4 通道 3,设置方法如下:
    1. <span class="fontstyle2">//</span><span class="fontstyle0">配置 </span><span class="fontstyle2">GPIO_B1_11 </span><span class="fontstyle0">为 </span><span class="fontstyle2">QTIMER4_TIMER3 </span><span class="fontstyle0">的输出引脚
    2. </span><span class="fontstyle2">IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_QTIMER4_TIMER3, 0);
    3. IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_11_QTIMER4_TIMER3, 0x10B0);</span>
    复制代码

    3) 初始化 QTMR4
    QTMR 的初始化使用函数 QTMR_Init 来设置,设置方法如下:
    1. <span class="fontstyle2">qtmr_config_t qtimer4pwm_config;
    2. QTMR_GetDefaultConfig(&qtimer4pwm_config); //</span><span class="fontstyle0">先设置为默认配置
    3. </span><span class="fontstyle2">qtimer4pwm_config.primarySource= kQTMR_ClockDivide_128; //</span><span class="fontstyle0">设置第一时钟源
    4. </span><span class="fontstyle2">QTMR_Init(TMR4,kQTMR_Channel_3,&qtimer4pwm_config); //</span><span class="fontstyle0">初始化 </span><span class="fontstyle2">TIM4 </span><span class="fontstyle0">通道 </span><span class="fontstyle2">3</span>
    复制代码

    3) 设置 PWM 功能。
    QTMR 的 PWM 功能通过函数 QTMR_SetupPwm 来设置,此函数原型如下:
    1. status_t QTMR_SetupPwm(TMR_Type * base,
    2. qtmr_channel_selection_t channel,
    3. uint32_t pwmFreqHz,
    4. uint8_t dutyCyclePercent,
    5. bool outputPolarity,
    6. uint32_t srcClock_Hz)
    复制代码

    base:指定要使用哪个定时器,这里使用 QTMR4,那么此参数就为 TMR4。
    Channel:指定要使用 QTMR 的哪个通道,本例程使用通道 3,因此此参数就为kQTMR_Channel_3。
    pwmFreqHz:所需的 PWM 波频率,单位为 HZ,比如要产生 5KHz 的 PWM,那么此参数
    就是 5000。dutyCyclePercent:所需 PWM 占空比的百分比值,比如要产生 50%占空比的 PWM,那么   此参数就是 50。
    outputPolarity: PWM 输出极性,也就是极性是否反转。
    srcClock_Hz:此参数为 QTMR 的时钟源频率, 比如我们设置 QTMR4 的时钟源为 IPG_CLK的 64 分频,那么此值应该为 150MHz/64=2.34375MHz。
    假如此时 QTMR4 时钟源频率为 2.34375Mhz,要在 QTMR4 的通道 3 上产生一个频率为500K,占空比为 50%的 PWM 波形,那么就可以使用如下代码:
    1. <span class="fontstyle2">//PWM </span><span class="fontstyle0">频率 </span><span class="fontstyle2">500K</span><span class="fontstyle0">,占空比 </span><span class="fontstyle2">50%
    2. QTMR_SetupPwm(TMR4, kQTMR_Channel_3, 500000, 50, false, 234375);</span>  
    复制代码

    4) 开启 QTMR4 通道 3
    QTMR 开启方法在第 14 章中已经讲解过了, QTMR4 的通道 3 可以使用如下代码:
    1. <span class="fontstyle3">//</span><span class="fontstyle1">通道 </span><span class="fontstyle3">3 </span><span class="fontstyle1">在第一时钟源的上升沿计数
    2. </span><span class="fontstyle3">QTMR_StartTimer(TMR4,kQTMR_Channel_3,kQTMR_PriSrcRiseEdge);</span>
    复制代码

    最后,在经过以上设置之后, PWM 其实已经开始输出了,只是其占空比和频率都是固定的,而我们通过修改 QTMR4 通道 3 的 CMPLD1 和 CMPLD2 寄存器,就可以控制该通道的PWM 占空比,继而控制 DS0 的亮度。  

    然后来看下硬件连接
    通过 QTMR4 的通道 3 来控制 DS0 的亮灭, DS0 是连接到 GPIO1_IO03(P103) 上的,而 QTMR4 通道 3 的输出是连接在 GPIO2_IO27(P227)上,如图 所示:  
    QQ截图20180714182417.jpg


    初始化QTIMER4通道3作为PWM输出通道,QTIMER4时钟源为IPG_CLK_ROOT=150MHz
    QQ截图20180714182624.jpg

    设置占空比
    QQ截图20180714182654.jpg


    在主函数中,初始化PWM,定时器时钟为:150/64=2.34375Mhz,设置频率为5Khz,50%占空比
    1. QTMR4_CH3_PWM_Init(14,5000,0);
    复制代码


    初始化ds0  的io

    1.     led_config.direction=kGPIO_DigitalInput;        //输出
    2.         led_config.interruptMode=kGPIO_NoIntmode;        //不使用中断功能
    3.         led_config.outputLogic=0;                                        //默认高电平,LED灯关闭
    4.         GPIO_PinInit(GPIO1,3,&led_config);                 //初始化GPIO1_3
    复制代码


    然后在循环体重 实现占空比的循环加减变化
    QQ截图20180714182838.jpg


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-26 10:40
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2020-2-23 21:53:41 | 显示全部楼层
    你好,能问个题吗?1052参考手册P2730不是说comp1和comp2是控制高低电平的吗?为什么更改占空比是修改的是cmpld1和cmpld2?
    nxp原文:
    The compare load feature is intended to be used in variable frequency PWM mode. The
    COMP1 register determines the pulse width for the logic low part of OFLAG and
    COMP2 determines the pulse width for the logic high part of OFLAG. The period of the
    waveform is determined by the COMP1 and COMP2 values and the frequency of the
    primary clock source. See the following figure.
    Should we desire to update the duty cycle or period of the above waveform, we would
    need to update the COMP1 and COMP2 values using the compare load feature.
    批注 2020-02-23 215146.png
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 10:19 , Processed in 0.120249 second(s), 18 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.