问题:
在学习DAC数模转换实验时,例程中使用了如下代码实现按键控制DAC寄存器:
if(key==WKUP_PRES)
{
if(dacval<4000)dacval+=200;
DAC_SetChannel1Data(DAC_Align_12b_R, dacval);
}else if(key==2)
{
if(dacval>200)dacval-=200;
else dacval=0;
DAC_SetChannel1Data(DAC_Align_12b_R, dacval);
}
功能很简单,按下按键后,对DAC寄存器中的数据进行加或减,可控制范围为0至4000,每次加或减200。
将按键加至设定的最大值4000后,如图,问题来了,功能倒是正常实现,但最大电压(DA转换后再使用AD转换并在LCD上显示)达不到3.3V。

提起4000,很难不联想到4096吧。细读了一遍函数 DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data),发现它的两个参数分别表示对齐方式与存入寄存器中的数据。例程中为12位右对齐,2^12=4096,能存入的数据最大值果然与此有关。于是将例程中的4000改为4096(此时代码无法正常实现功能,仅用于验证),再次按键至最大值:

OK,产生溢出了,溢出的数据正正好好,也就是说最多可以往寄存器中存入4095。
加一行代码 if(dacval>=4000)dacval=4095;

成功达到(接近)3.3V。
文章讲述了在学习DAC实验时,通过按键控制DAC寄存器的值,发现最大值限制在4095而非预期的4000。通过调整代码并处理溢出,作者成功实现了接近3.3V的最大电压输出。
6353

被折叠的 条评论
为什么被折叠?



