在线时间108 小时
UID2094411
注册时间2017-9-13
NXP金币115
TA的每日心情 | 开心 2017-12-26 10:16 |
|---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
高级会员

- 积分
- 842
- 最后登录
- 2026-8-28
|
好巧不巧,网友也驱动了一个intel 接口风扇。我这里有一个限制的利民散热风扇,9CM标准接口,支持PWM调速和FG测试。一般测试线
频率不高,可能是一转一个脉冲或2个脉冲。利民这个扇子通电就可以自转了。是一个最低保持转速,静音转速。
FRDM MCXA366有众多的接口,输出PWM是很容易的事情,这里就按风扇的规约,25K脉冲来配置.
调速:使用CTIMER1的2通道输出,下图代码配置
- srcClock_Hz = CTIMER_CLK_FREQ;
- CTIMER_GetDefaultConfig(&pconfig);
- timerClock = srcClock_Hz / (pconfig.prescale + 1);
- CTIMER_Init(CTIMER, &pconfig);
- /* Get the PWM period match value and pulse width match value of 20Khz PWM signal with 20% dutycycle */
- CTIMER_GetPwmPeriodValue(25000, (uint8_t)DUTYCYCLE, timerClock);
- CTIMER_SetupPwmPeriod(CTIMER, CTIMER_MAT_PWM_PERIOD_CHANNEL, CTIMER_MAT_OUT, g_pwmPeriod, g_pulsePeriod, false);
- CTIMER_StartTimer(CTIMER);
复制代码 同时写一个函数,可以动态修改寄存器,实现占空比变化,如图。然后修改占空比可观察到风扇加速
测速:综合考虑后使用一个GPIO中断来做。考虑精确性尽可能高,并且数值相对平滑,这里使用测周期方法。配置DWT来记录微妙节拍实现时长统计。如下
- void DWT_Init(void)
- {
- CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
- DWT->CYCCNT = 0UL;
- DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
- }
- static inline uint32_t DWT_GetUS(void)
- {
- return DWT->CYCCNT / (CPU_CORE_FREQ / 1000000UL);
- }
复制代码 配置GPIO1的中断,这里直接使用板载按键配置的引脚。上拉输入可以不配置,实测风扇本身也内置了上拉。开启引脚中断。转取下降沿信号 - GPIO_SetPinInterruptConfig(GPIO1, 7U, kGPIO_InterruptFallingEdge);
- EnableIRQ(GPIO1_IRQn);
- GPIO_PinInit(GPIO1, 7U, &sw_config);
复制代码 中断内简单计时
- void GPIO1_IRQHandler(void)
- {
- /* Clear external interrupt flag. */
- GPIO_GpioClearInterruptFlags(GPIO1, 1U << 7U);
- /* Change state of button. */
- g_pulse_us = DWT_GetUS();
- g_new_pulse_flag = 1U;
- SDK_ISR_EXIT_BARRIER;
- }
复制代码 主循环内轮询标志,进行计算。
为了直观的测试,配置一个图形化界面,表盘空间来显示转速。debug模式下直接修改占空比,然后观察上位机界面数值变化。
风扇的参数是2200rpm最大,最小转速一般会有限制,这款利民扇测试占空比最低20%就失效了,不会停转,最低保持转速在2200*20=440转,但本项目测试的转速在370,当然满速时也没有达到2200。测量误差和风扇性能参数字面效果应该都存在就不深究了。
测试真相可以看视频
温度闭环用作散热需求场合,本例使用的板载温度计无法方便实现较大的温差变化,不做实际演示了。举个例子:占空比20%是最低限,假设此时容许的温度为25度,当温度升高到50度时开启全速,那么就以k=80/25作为温度和占空比的系数来设计。线性度一般是比较好的。
|
|