STM32 PWM DAC实验:cubemx实现

拜拜、爱过 提交于 2020-01-03 18:25:35

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,追求准确的需求还是不要用这种方式比较好。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!