TI中文支持网
TI专业的中文技术问题搜集分享网站

AMC7834_ADC相关的问题.

同样的驱动代码, 有的板子ADC正常, 有的不正常.主要表现为配置ADC无法进行自动转换.

ADC相关的初始化流程为:

1. 配置芯片为活跃模式.(0x02寄存器)

2. 配置ADC模式为自动转换.(0x10寄存器)

3. 打开全部ADC通道.(0x12寄存器)

4. 循环读取综合状态寄存器, 等待ADC_READY等于1,再继续往下运行.(0x1F寄存器)

5. 开启ADC自动转换.(0x1C寄存器)

运行以上步骤后, 复读0x10, ADC转换模式配置正常, 循环读取综合寄存器, ADC_READY一直为1, 所有DAV一直为0.

请问可能是硬件或软件哪方面未达到驱动要求而导致的此问题?

user151383853:

这种情况, 通常硬件的可能性比较大

比如电压值,复位电压,通讯信号电平,还有 通讯时序时间等接近或落在临界范围内。

容易出现这样的问题

Amy Luo:

您好,
芯片管脚1脚:DAV/ADC_RDY外部电路是怎么接的,另外这几个寄存器配置的是什么值呢

user5866130:

回复 Amy Luo:

DAV/ADC_RDY引脚为悬空, 未使用. 判断ADC_RDY是通过综合状态寄存器(0x1F)的bit14进行判断的.

各寄存器具体值的话, 是用位域结构体抽象而来的, 如下

{AMC7834_SoftResetRegTypeDef SoftResetRegStruct = { 0 };SoftResetRegStruct.SoftReset = AMC7834_SOFT_RESET_REG_SOFT_RESET_ENABLE;DAC_WriteRegister(DAC_REG_SOFTWARE_RST, DAC_REG_DATA_TO_U16(SoftResetRegStruct));/* 软件复位(只写寄存器) */}SYS_Delayms(1);{AMC7834_AmcCfgReg0TypeDef AmcCfgReg0Struct = { 0 };AmcCfgReg0Struct.Loop_EN= AMC7834_DISABLE; /* 闭环模式 */AmcCfgReg0Struct.RT_Set= AMC7834_AMC_CFG_REG0_RT_SET_16MS;AmcCfgReg0Struct.CS_Filter = AMC7834_AMC_CFG_REG0_CS_FILTER_0MS_2;AmcCfgReg0Struct.CMode= AMC7834_AMC_CFG_REG0_CMODE_AUTO_MODE;/* ADC 自动转换模式 */if (DAC_WriteAndRereadRegister(DAC_REG_AMC_CFG_0, DAC_REG_DATA_TO_U16(AmcCfgReg0Struct))!= DAC_OK)/* 初始化模拟监控配置寄存器0 */{return DAC_INIT_FAULT;}}{AMC7834_PowerModeRegTypeDef PowerModeRegStruct = { 0 };PowerModeRegStruct.PowerMode = AMC7834_POWER_MODE_REG_POWER_MODE_ACTIVE;/* 活跃模式 */if (DAC_WriteAndRereadRegister(DAC_REG_POWER_MODE, DAC_REG_DATA_TO_U16(PowerModeRegStruct))!= DAC_OK)/* 初始化电源模式寄存器 */{return DAC_INIT_FAULT;}}{uint32_t StartTime = SYS_GetTickCount32ms();for (;;){DAC_ReadGeneralStatus();/* 读综合状态 */if (DAC_GeneralStatusBuffer.ADC_Ready == AMC7834_ENABLE)/* ADC已准备完毕 */{break;}if (SYS_GetTickCount32Dms(StartTime, SYS_GetTickCount32ms())>= DAC_INIT_TIMEOUT_MS)/* 初始化超时 */{return DAC_INIT_FAULT;}}}{AMC7834_DacAdcTriggerRegTypeDef DacAdcTriggerRegStruct = { 0 };DacAdcTriggerRegStruct.ADC_Trig = AMC7834_ENABLE;/* 开启ADC自动转换 */DacAdcTriggerRegStruct.DAC_Trig = AMC7834_DISABLE;DAC_WriteRegister(DAC_REG_DAC_ADC_TRIGGER, DAC_REG_DATA_TO_U16(DacAdcTriggerRegStruct));/* 初始化DAC_ADC触发寄存器(只写寄存器) */}


现在通过使用下列方法解决了问题:

1. 见1楼的初始化操作.

2. 由于初始化操作后综合状态寄存器(0x1F)中的bit14, ADC_Ready 还是等于1, 所以我就只要bit还等于1我就不断

给DAC和ADC触发寄存器(0x1C), 写0x0001, 触发ADC自动转换.

3. 有问题的片子, 有的初始化之后再触发1次就可以自动采集了, 有的片子要再触发2次. 触发完毕后如果 ADC_Ready 为0,

就不再需要触发.

新增代码

*(uint16_t *)&DAC_GeneralStatusBuffer = DAC_ReadRegister(DAC_REG_GENERAL_STATUS);/* 由于AMC7834触发ADC转换时, 有个未知问题, 有的芯片能够初始化正常,有的不正常, 所以这里检测ADC_Ready依然为使能时, 重新再触发一次ADC转换 */if (DAC_GeneralStatusBuffer.ADC_Ready == AMC7834_ENABLE){AMC7834_DacAdcTriggerRegTypeDef DacAdcTriggerRegStruct = { 0 };DacAdcTriggerRegStruct.ADC_Trig = AMC7834_ENABLE;/* 开启ADC自动转换 */DacAdcTriggerRegStruct.DAC_Trig = AMC7834_DISABLE;DAC_WriteRegister(DAC_REG_DAC_ADC_TRIGGER, DAC_REG_DATA_TO_U16(DacAdcTriggerRegStruct));/* 初始化DAC_ADC触发寄存器(只写寄存器) */}

user5866130:

回复 user151383853:

所有的配置寄存器擦破做(除了只写寄存器), 都进行了回读匹配确认, 均未发现过匹配异常的情况, 这个情况基本上不可能. 除非通讯错误一直出现在操作只写寄存器的时候.

赞(0)
未经允许不得转载:TI中文支持网 » AMC7834_ADC相关的问题.
分享到: 更多 (0)