主题中讨论的其他器件:HALCOGEN
你(们)好。
对于电机控制软件、我在 PWM (Cntr Zero 和 PRD;每个周期两次测量)上触发了 ADC MesasureMnt。 总共有7个通道可在 PWM Cntr Zero 和 PRD (3倍电流;4倍电压)上测量。 ADC 组1的 FIFO 大小设置为14、因此每个 PWM 周期调用一次 ADC_notifaction。 (查看以下图片)
使用以下代码读取 ADC 结果(在 ADC_notification 中输入代码):
静态 adcData_t bufferRawAdcData[14]={0};
静态 uint32_t AdcCnt = 0;
AdcCnt = adcGetData (adcREG1、adcGROUP1、bufferRawAdcData);
由于有14个 ADC 值、因此 AdcCnt 始终为14。 通道 ID 8位于 bufferRawAdcData[0] (当 PWM =零时)和 bufferRawAdcData[8](当 PWM=PRD 时)中、这种方法有效、但不可靠! 主要问题是、在 bufferRawAdcData[0]上、有时是通道 ID 14、后跟通道 ID 15。 在 sevral 测量之后、整个东西恢复、 bufferRawAdcData[0]再次为 ID 8。 这种行为绝不能发生! 存在偏移! 发生这种情况时、它不是确定性的! 有时在5秒后;有时每秒多次...
对 HalCoGen 函数(文件 ADC.c)的以下修改解决了这个问题:
uint32 adcGetData (adcBASE-t * ADC、uint32组、adcData_t * data)
{
uint32 i;
uint32 buf;
uint32 模式;
uint32 索引=(ADC = adcREG1)? 0U:1U;
uint32 intcr_reg = adc->GxINTCR[组];
uint32 count =(intcr_reg >=256U)? s_adcFoSize[index][group]:(s_adcFoS[index][group]-(uint32)(intcr_reg & 0xFFU);
adcData_t * ptr =数据;
/*用户代码开始(16)*/
/*用户代码结束*/
MODE =(ADC->OPMODECR & ADC_12_bit_MODE);
IF (MODE = ADC_12_bit_MODE)
{
/**- 获取转换数据和通道/引脚 ID */
对于(I = 0U;I < count;I++)
{
BUF = ADC->GxBUF[group].BUF0;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
ptr ->值=(uint16)(buf & 0xFFFU);
ptr -> id =(uint32)((buf >> 16U)& 0x1FU);
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
PTR++;
}
}
其他
{
/**- 获取转换数据和通道/引脚 ID */
对于(I = 0U;I < count;I++)
{
BUF = ADC->GxBUF[group].BUF0;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
ptr ->值=(uint16)(buf & 0x3FFU);
ptr -> id =(uint32)((buf >> 10U)& 0x1FU);
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
PTR++;
}
}
ADC->GxINTFLG[组]=9U;
/** @请注意,必须先调用 adcInit 函数,然后才能使用此函数。\n
* 用户负责初始化消息框。
*
/*用户代码开始(17)*/
while (!(adc -> GxINTFlg[组]和0x04)
{
index =(ADC =adcREG1)? 0U:1U;
adcData_t * ptr =数据;
IF (MODE = ADC_12_bit_MODE)
{
/**- 获取转换数据和通道/引脚 ID */
对于(I = 0U;I < count;I++)
{
BUF = ADC->GxBUF[group].BUF0;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
ptr ->值=(uint16)(buf & 0xFFFU);
ptr -> id =(uint32)((buf >> 16U)& 0x1FU);
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
PTR++;
}
}
其他
{
/**- 获取转换数据和通道/引脚 ID */
对于(I = 0U;I < count;I++)
{
BUF = ADC->GxBUF[group].BUF0;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
ptr ->值=(uint16)(buf & 0x3FFU);
ptr -> id =(uint32)((buf >> 10U)& 0x1FU);
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
PTR++;
}
}
ADC->GxINTFLG[组]=9U;
}
/*用户代码结束*/
返回计数;
}
是否有更好的解决方案? while 循环 whitlin adcGetData 占空缓冲区、这看起来像是一个时序问题。 在开始下一次转换之前是否必须复位标志?
感谢你的帮助。
此致、
Patrick








