https://blog.csdn.net/wu10188/article/details/97554814/
先摸一会
啥子是HRTIM定时器
简单说就是很牛逼的定时器,普通定时器能干的事他都能干,特点是能够高频率高精度的输出PWM,可以配置死区时间,而且还特别设计的有保护外设(快速关闭PWM输出)。
他一共有六个定时器,主要是区分为 Master 和 ABCDE 定时器,Master定时器没有输出,ABCDE定时器都能够正常输出,但是会根据芯片规格封装不同,导致一些定时器没有输出,比如C8T6的E定时器就没有输出。
配置使用流程
一定要使能HRTIM时钟,否则你就会和我一样疑惑。这B HRTIM的倍频模式我咋都不能选呢?
想用哪个就使能哪个输出,每个定时器都有两个输出,既可以输出互补也可以独立输出。
Master定时器根据自己需要使能,可以不使能,不影响其他子定时器。
如果你使能了多个定时器,每个定时器都需要独立设置。
建议使用Advanced模式,虽然没区别,但是Advanced模式提供更多可控制的函数,并且还是能正常使用Basic函数(没试过反过来行不行)
选择倍频数值,当然也可以选择为分频,这里比较贴心的是把频率换算出来了。自己定一个PWM分辨率,就能得到PWM的输出频率,我试过能到到Mhz级别的输出频率,但是波形就很难看了,这主要就考虑到PCB布局的影响了。
如上图继续设置
这里的比较单元可以看做变量,可以PWM和ADC触发会以这个值触发,如果只输出PWM,使能一个就够了,这里填的值是默认值。
如上图配置,实际情况,下死区不能为0嗷
意思是活跃状态为输出高电平,意味着可以根据自己需要改成反向的,活跃状态输出低电平,这样控制上下管导通很方便。
设置活跃状态数量
意思是可以设置多个触发,让TD1变为活跃状态进行输出,这里的意思是:一个周期开始后强制让输出变为活跃状态。
设置非活跃状态数量
用法同上,这里的意思是:当计数器数值到比较单元数值后,强制让TD1变为非活跃状态,关闭输出。
如果设置为互补输出,TD2不需要任何设置,会自动和TD1进行互补输出,但是可以改变TD2的活跃输出状态,使他们输出反向。
基础应用就配置完成,就可以生成代码了。
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TC1 | HRTIM_OUTPUT_TC2); //通道打开
HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_TIMER_C);
使能定时器和输出通道
hhrtim1.Instance->sTimerxRegs[0].PERxR = 50000;//通过修改重装载值PER,从而修改PWM的频率
hhrtim1.Instance->sTimerxRegs[0].CMP1xR = 11504;//通过修改比较值CMP,从而修改占空比
//sTimerxRegs[0]---->TimerA
//sTimerxRegs[1]---->TimerB
//sTimerxRegs[2]---->TimerC
//sTimerxRegs[3]---->TimerD
//sTimerxRegs[4]---->TimerE
修改频率和占空比
完事,这样就能用了。
进阶——ADC触发
先正常使能和配置ADC
启用扫描模式,这是为了保证输出的ADC数组是对应连续的,比如IN1=ADC[0],IN2=ADC[1]
这里不用连续模式是因为要通过HRTIM触发ADC。
启用DMA,提高ADC传输速度和效率
DMA配置如图所示。
回到HRTIM设置,使能触发源1和3,理由下面说,然后记得新使能一个比较单元,值比较随意,然后选上
ADC通道配置
触发源选择如图所示,称为触发源1,这是规则转换必须选择的,
F334RCT6只有两个ADC,1个ADC对应2个HRTIM触发源,13是规则转换,24是侵入转换(不懂没用过)
这里非常值得说的是,ADC的采样周期设置。一般来说,如果采样间隔太短,ADC就会越短越不准
但是,可以通过给ADC引脚并联一个PF级别电容改善情况,实测在4.5Cyc下,并联一个47PF的电容,ADC采样几乎是正确的。这是因为ADC在高速采样中没有足够的时间吸取电荷,就需要电容给ADC作为一个中继
这样就配置完成了。
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, ADC1_Value, 4);
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc2, ADC2_Value, 4);
这样使能ADC的DMA,只需要执行一次,但是还没有ADC转换结果!因为ADC是HRTIM触发的,所以必须使能HRTIM对应的通道后,ADC才会有输出!