TA的每日心情 | 擦汗 2018-8-4 22:53 |
---|
签到天数: 37 天 连续签到: 2 天 [LV.5]常住居民I
|
本帖最后由 煮饺子水洗脚 于 2018-7-14 18:29 编辑
本帖主要来学习QTMR定时器PWM输出的使用。
本实验,main函数会初始化QTMR4的第4个定时器(QTMR4_CH3,使用GPIO2_IO27),用于输出PWM脉冲,需要拿一根杜邦线连接GPIO2_IO27和GPIO1_IO03,让PWM脉冲来控制DS0的亮度.main函数里面,会自动修改PWM脉宽,从而控制DS0由亮到灭,由灭到亮的循环.
先看下实验效果吧
脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。 RT1052 的 QTMR 定时器支持交替比较模式(CTRLy[OUTMODE]=100, y 表示通道编号,范围: 0~3,下同)生成 PWM,生成过程如图所示:
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) :
通道状态&控制寄存器寄存器(QTMRx_SCTRLy)
:
通道比较值预加载寄存器 1(QTMRx_CMPLD1y)
1.使能 QTMR4 的时钟
使用函数 CLOCK_EnableClock 使能 QTMR4 时钟,使用方法如下:
- CLOCK_EnableClock(kCLOCK_Timer4)
复制代码
此函数会被 QTMR 定时器初始化函数 QTMR_Init 调用,所以不需要我们显示的调用。
2) 初始化 GPIO_B1_11(GPIO2_IO27)。
因为要输出 PWM 波形,因此需要将 GPIO_B1_11(GPIO2_IO27)设置为 QTMR4 通道 3,设置方法如下:
- <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">的输出引脚
- </span><span class="fontstyle2">IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_QTIMER4_TIMER3, 0);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_11_QTIMER4_TIMER3, 0x10B0);</span>
复制代码
3) 初始化 QTMR4
QTMR 的初始化使用函数 QTMR_Init 来设置,设置方法如下:
- <span class="fontstyle2">qtmr_config_t qtimer4pwm_config;
- QTMR_GetDefaultConfig(&qtimer4pwm_config); //</span><span class="fontstyle0">先设置为默认配置
- </span><span class="fontstyle2">qtimer4pwm_config.primarySource= kQTMR_ClockDivide_128; //</span><span class="fontstyle0">设置第一时钟源
- </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 来设置,此函数原型如下:
- status_t QTMR_SetupPwm(TMR_Type * base,
- qtmr_channel_selection_t channel,
- uint32_t pwmFreqHz,
- uint8_t dutyCyclePercent,
- bool outputPolarity,
- 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 波形,那么就可以使用如下代码:
- <span class="fontstyle2">//PWM </span><span class="fontstyle0">频率 </span><span class="fontstyle2">500K</span><span class="fontstyle0">,占空比 </span><span class="fontstyle2">50%
- QTMR_SetupPwm(TMR4, kQTMR_Channel_3, 500000, 50, false, 234375);</span>
复制代码
4) 开启 QTMR4 通道 3
QTMR 开启方法在第 14 章中已经讲解过了, QTMR4 的通道 3 可以使用如下代码:
- <span class="fontstyle3">//</span><span class="fontstyle1">通道 </span><span class="fontstyle3">3 </span><span class="fontstyle1">在第一时钟源的上升沿计数
- </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)上,如图 所示:
初始化QTIMER4通道3作为PWM输出通道,QTIMER4时钟源为IPG_CLK_ROOT=150MHz
设置占空比
在主函数中,初始化PWM,定时器时钟为:150/64=2.34375Mhz,设置频率为5Khz,50%占空比
- QTMR4_CH3_PWM_Init(14,5000,0);
复制代码
初始化ds0 的io
- led_config.direction=kGPIO_DigitalInput; //输出
- led_config.interruptMode=kGPIO_NoIntmode; //不使用中断功能
- led_config.outputLogic=0; //默认高电平,LED灯关闭
- GPIO_PinInit(GPIO1,3,&led_config); //初始化GPIO1_3
复制代码
然后在循环体重 实现占空比的循环加减变化
|
|