PWM DAC其实跟DAC是两码事,DAC是STM32的一个功能,可以直接输出(0~3.3V)。而PWM DAC是定时器TIM的PWM功能间接实现输出模拟量,实际端口输出的是(0或3.3V),只不过应用RC滤波将电压稳定在(0~3.3V之间)。在对输出精度不高的时候可以用该方式。
该实验是TIM PWM的拓展。当用作DAC时需要滤波,阿波罗采用二阶RC滤波,而RC(电阻电容)是跟PWM的频率有关系的。
之前的TIM PWM实验是实现呼吸灯效果,用的是90分频,因为TIM的时钟为90MHZ,分频后的周期为1us,PWM自动重装载值为500,向上计数,如果比较值是250,那么就是250us输出0,250us输出1。
那么这个实验是用256分频,也是根据90M/256=351.5KHZ来确定的RC。
那为什么要用256分频呢?其实用200、300、400都可以,只不过为了规范,我们设计此次DAC采用8位精度,也就是256。TIM最大支持16位的,但是分辨率越高,分频后的频率越低,周期越长。所以用8位还是比较好的。
如何理解PWM呢,就好像是一个灯泡,他的额定电压是自动重装载值,低于比较值他就灭,高于比较值他就亮,虽然电压从0到自动装载值匀速变化,灯泡也亮灭转换,但当速度快时,人眼就看不出来亮灭了,我们只能看到他是柔和的光不亮不暗。(比较值/自动重装载值) 就是你想让他亮的程度。
更何况应用TIM的PWM的DAC加上了RC滤波,电平变化就很稳定了。
cubemx配置:
prescaler分频系数:前面我们介绍到用256,八位的分辨率,减一是因为范围由(0~65535),八位的自然是255
counter mode :向上计数
period自动重装载值:为了方便计算也用256,多少都可以
pulse比较值:设为初始值是自动装载值的一半,那么打开PWM后,DAC输出应该3.3/2=1.65V。我们想要更改DAC输出值也是直接更改此参数。
CH polarity极性:就是说当计数值超过比较值时输出高电平3.3V还是低电平0V。
gpio mode:模拟量推挽输出
pull-up/pull-down:不用上拉下拉
speed:低速就够了
//第一步,初始化TIM9
MX_TIM9_Init();
//第二步,打开PWM
HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_2);
//控制占空比方法(库函数法)推荐,能用
//设置TIM9通道2的占空比
//compare:比较值
void User_SetTIM9Compare2(uint32_t compare)
{
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = compare;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_2);
}
//控制占空比方法(寄存器法)不推荐,能用
void User_SetTIM9Compare2(uint32_t compare)
{
TIM9->CCR2=compare;
}
实验现象:
可以看出TIM的PWM的DAC并不准确,用阿波罗源程序也是这个现象。并且上下跳动±0.02V,追求准确的需求还是不要用这种方式比较好。
来源:CSDN
作者:坛城
链接:https://blog.csdn.net/nianzhu2937/article/details/103819577