由于使用环境的问题H743的DAC输出值有偏差,我想对H743的DAC通道缓冲器进行校准,OTRIM[4:0]位的默认值是16,我尝试更改该位的值(1和31都有尝试),但是DAC的输出电压好像没有什么变化(通过示波器来测量DAC的输出电压)。后面会附上我的代码,有两个问题请教各位大佬: 1.有关缓冲器校准的程序是否有问题? 2.OTRIM[4:0]的范围是0到31,那么步进值是多少呢?我的理解:假如VDD=VDDA=VREFIN=3.3V,OTRIM[4:0]值设置为31,那么步进值 = 3.3/(4096),那么校准后的电压值 = 校准前的电压值 + 31*步进值。不知道我理解的是不是对的。麻烦大佬提供一些帮助。 下面是DAC的配置: static void DAC_Ch1_Config(void) { DacHandle.Instance = DAC1; /##-1- Initialize the DAC peripheral ######################################/ if (HAL_DAC_Init(&DacHandle) != HAL_OK) { / DAC initialization Error / Error_Handler(); } /##-2- DAC channel2 Configuration #########################################/ sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_BOTH; sConfig.DAC_UserTrimming = DAC_TRIMMING_USER; sConfig.DAC_TrimmingValue = 31; if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK) { / Channel configuration Error / Error_Handler(); } HAL_DACEx_SelfCalibrate(&DacHandle, &sConfig, DAC_CHANNEL_1); /##-5- Set DAC channel1 DHR12RD register ################################################/ if (HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x7FF) != HAL_OK) { / Setting value Error / Error_Handler(); } /##-4- Enable DAC Channel1 ################################################/ if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK) { / Start Error / Error_Handler(); } } |
STM32H743采用flash swap 进行IAP升级,reset后启动不了
STM32双核H7核间通信的方法
STM32H743IIC,HAL库驱动硬件I2C,hi2c2.state一直是busy. 为什么?
H747 DSI 模块的官方例程跑不通
MAC回环或以太网PHY芯片回环怎么实现?
STM32745/747芯片固件升级问题
STM32H750更改时钟后,程序无法运行
疑似STM32CUBEIDE出现BUG
单片机复位后引脚状态
STM32H743VGT6外部晶振不起振
看RM0468手册1248页上说,OTRIMx:These bits are available only on dual-channel DACs
我留意到这句话了,但是这句话是针对OTRIM2的,也适用OTRIM1吗?我使用的是Channel1。
[md]这就不清楚了,没用过
校准是调整额外的偏移量,这个电压很小,估计示波器可能很难量测出来变化。
我认为你这个说法是合理的,示波器应该是很难测出电压变化的。我用万用表测了一下(6位半的万用表,精度肯定满足),如果采用12位右对齐方式的话,将OTRIM分别设置成1和31,实测二者输出电压相差23mv左右,理论计算(3300/4096)(31-1)=24mv,这个结果好像是能说通的。但是如果采用8位右对齐方式的话,实测二者输出电压也是相差23mv左右,理论计算(3300/256)(31-1)=386mv,这个相差是比较大的。不知道我这种计算方式是不是正确的,或者说DAC的补偿方式是不是一种线性补偿?
从厂家的手册上看,这应该是个额外附加上的偏移电压。
如截图上红圈所示,它是加号,所以我认为它不是线性比列关系,是每个具体电路结构带来固定的值。
谢谢大佬的解答。也就是说理论值(3300/256)*(31-1)不能简单的这样计算,所以和实测值相差很多?是这样理解吗
我的理解是这样的,用这个乘法公式不合适。
非常感谢😄
1、我们知道,DAC的实际输出是理论值和偏差之和,这个偏差对应参考手册中那个输出公式中的VOS.
正因为实际输出跟理论值存在偏差,所以在实际应用中需要做输出校正,让实际输出尽量接近理论值。
2、STM32H7芯片内部的DAC都支持输出校正功能,即实际输出是基于当前转换结果结合当前校准寄存器里
的校准值即OTRIM值 实施校准 后的最后输出。每个DAC模块的校准各种独立。
3、关于OTRIM值的获得。STM32H7芯片在出厂时就基于一定条件做了校准操作,得到相应的OTRIM值存储到对应
的寄存器,使用DAC时即可使用。
当然,出厂校准条件未必适应所有应用场合,用户适时地重新启动校准操作并获取新的OTRIM值也是正常、必要的。
我们可以发现OTRIM字段是可以读写的,但通过DAC校准并获取合适的ORTIM值是 硬件确定 的,即哪个值最合适是
硬件确定的,具体就是在校准操作过程中找到最佳OTRIM值后通过特定状态位给予用户提示并存储到特定寄存器。
我们不能 随意或想当然 写入特定的OTRIM值,虽然你现有这个权利或能力。
做DAC校准操作时,实际上是硬件基于中间点0x800的输出和理论值进行反复比较、修正实现的,并得到最终的最佳
OTRIM值。关于这点的更多细节可以阅读参考手册。
打个比方:
手头示波器的4支架突然坏掉一个放不平稳了,你想让旁人给你几本书垫一下,假设书本规格都一样,最后到底用几本才合适,
不是递书人说了算,而是你经过多次尝试后,最好来一声“好了”时才定下来的。如果让递书人跟着感觉一次给你几本,
可能神助力刚刚好,但也可能不是多了就是少了。
4、至于每个OTRIM单位对应的电压步进,我的理解跟你的一样。实际上,在数据手册里有给出中间点0x800时对应的步进值,
跟我们计算的差不多,但不一样。它这个值仅仅针对输入0x800时做校准的步进值,跟全范围的平均步进值有差异可以理解。
其实,看到这里,我们是否知道这个步进值其实并不重要。因为校准本身是硬件完成的,哪个值最合适也不是用户随意定的。
在实施用户校准过程中,我们用户充其量做了上面递书的人,到底要几本才合适不是递书人说了算的。
5、这里的DAC校准及输出校正针对使能了DAC BUFFER功能。
大佬,请接受来自菜鸟的膜拜!讲解的太详细了,豁然开朗。非常感谢!
我还有一个疑惑:在得到最佳OTRIM值后,将该值存入特定寄存器。至此,校准过程是否已经完成?还需要用户将得到的最佳OTRIM值跟ODR寄存器的值做加法操作吗?
[md]无须客气,探讨交流而已。
在校准过程中有个标志提示“上面比方中的那声“好了””,此时的最佳trim值找到了,最终自然是写进DAC_CCR寄存器了。
之后DAC运行时硬件会 自动基于这个TRIM值做修正后 做最后的输出。
[md]感谢,感谢!