背景
项目开发的其中一个需求是采集8个电机的反馈电压,使用示波器观察pwm高电平的时候电压数据比较稳定可靠,所以要在上升沿的时候进行采集。
主控芯片使用的是stm32f407,rtthread底层还是调用的是hal库所以使用cubxmx先生成代码,先在kile上跑通在向rtthread移植。
Cubemx 配置
pwm
使用定时器1的通道1触发adc转换配置如下
时钟配置
这里因为TIM1是在APB2总线上等下配置pwm的时候要用到
这里选着的是TIM1的channel 1所以trigger event selection 选着 output compare(OC1REF)
使用的是TIM1
Freq = CK_PSC / (PSC + 1) / (ARR + 1)
144 000 000 / 6 / 1000 = 24 000 频率为24khz
一般的电机频率不会低于20khz低于20khz电机会发出声音。
DMA
其中比较难理解的是这个 Number Of Discontinuous Conversions 下面的解释是不连续转换的数量是1~8之间,意思比较容易理解但是没有交代清楚,是A通道转换8次后再去转换B通道8次还是adcdefg转换后在重复abcdefg 8次。经过查看手册是adcdefg8次。
这里一开始DMA应该是disable要点到配置DAM才行。
到这就结束了。生成代码就行,下面看代码部分。
代码
开始转换pwm给触发信号
开始adc转换
基本就没啥问题了。
下面开始移植把
把pwm adc dma函数移到rtthread board.c 其中这个中断函数也要移进去,这个中断是ADC转换完成让DMA干活的中断。