来自不同 AD7606 通道的混合电压读数
Mixed voltage reading from different AD7606 channels
请帮忙!我正在使用 FSMC 将 STM32F407 MCU 与 AD7606 连接以采样电压值。 MCU 将采样值经过 1024 次转换后通过 USB HS 端口发送给 PC。但是当我检查来自 PC 的值时,我发现来自通道 0 的读数偶尔会包含来自其他通道的数据。例如,如果将通道 0 连接到 5v,将通道 8 连接到 3.3v,将其他通道连接到地。那么来自通道 0 的打印值将包含 5v、0v、3.3v。基本设置如下:
- 一个200KHZ PWM信号由TIM10产生作为AD7606的CONVST信号。
然后7606会发出一个BUSY信号,我用它作为外部中断源。
- 在中断处理程序中,将发出DMA请求以读取8个16位数据
从 FSMC 地址 space 到内存 space。如果 1024
,TIM10 PWM 将停止
转换已完成。
- 在DMAXFER_CPLT回调中,如果已经完成1024次转换,转换后的
数据将通过 USB HS 端口发送出去,TIM10 PWM 将再次启用。
一些代码块:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_7)
{
// DMA data from FSMC to memory
HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, 0x6C000000, (uint32_t)(adc_data + adc_data_idx) , 8);
adc_data_idx += 8;
if (adc_data_idx >= ADC_DATA_SIZE)
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
}
}
void dma_done(DMA_HandleTypeDef *_hdma)
{
int i;
int ret;
// adc_data[adc_data_idx] would always contain data from
// channel 1, led1 wouldn't light if every thing is fine.
if (adc_data[adc_data_idx] < 0x7f00 )
HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_SET);
if (adc_data_idx >= ADC_DATA_SIZE)
{
if(hUsbDeviceHS.dev_state == USBD_STATE_CONFIGURED)
{
// if I don't call CDC_Transmit_HS, everything is fine.
ret = CDC_Transmit_HS((uint8_t *)(adc_data), ADC_DATA_SIZE * 2 );
if (ret != USBD_OK)
{
HAL_GPIO_WritePin(led1_GPIO_Port, led2_Pin, GPIO_PIN_SET);
}
}
adc_data_idx = 0;
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
}
}
貌似单次USB传输会超过5us(一个转换时间),所以我停止了PWM信号来停止转换...
如果我只发送数据缓冲区的后半部分,则不会出现数据混合。这很奇怪。
根据您的描述,我认为处理是正确的,问题出在CDC_Transmit_HS()
;我在CDC_Transmit_FS()
遇到问题,原来的代码无法传输超过64字节的数据,需要修改一些代码,否则会出现一些错误。您检查接收到的数据数量是否正确?
参考:
我不确定你的 ADC_DATA_SIZE
尺码;如果大于64字节,也许你可以修改为小于64字节,再试一次,检查数据是否正确。我不确定是否受此问题影响,但我认为您可以尝试一下。
另一方面,可能还需要将AD7606未使用的ADC IN引脚接地,以避免通道间干扰。
或者您可以尝试其他通信方式(I2C、SPI、UART...等)来发送数据。
如果其他通讯方式没有问题,那么很有可能是CDC_Transmit_HS()
的问题。如果其他传输方式有问题,可能要检查ADC转换时间和传输时间是否有冲突。
请帮忙!我正在使用 FSMC 将 STM32F407 MCU 与 AD7606 连接以采样电压值。 MCU 将采样值经过 1024 次转换后通过 USB HS 端口发送给 PC。但是当我检查来自 PC 的值时,我发现来自通道 0 的读数偶尔会包含来自其他通道的数据。例如,如果将通道 0 连接到 5v,将通道 8 连接到 3.3v,将其他通道连接到地。那么来自通道 0 的打印值将包含 5v、0v、3.3v。基本设置如下:
- 一个200KHZ PWM信号由TIM10产生作为AD7606的CONVST信号。
然后7606会发出一个BUSY信号,我用它作为外部中断源。 - 在中断处理程序中,将发出DMA请求以读取8个16位数据
从 FSMC 地址 space 到内存 space。如果 1024
,TIM10 PWM 将停止 转换已完成。 - 在DMAXFER_CPLT回调中,如果已经完成1024次转换,转换后的
数据将通过 USB HS 端口发送出去,TIM10 PWM 将再次启用。
一些代码块:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_7)
{
// DMA data from FSMC to memory
HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, 0x6C000000, (uint32_t)(adc_data + adc_data_idx) , 8);
adc_data_idx += 8;
if (adc_data_idx >= ADC_DATA_SIZE)
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
}
}
void dma_done(DMA_HandleTypeDef *_hdma)
{
int i;
int ret;
// adc_data[adc_data_idx] would always contain data from
// channel 1, led1 wouldn't light if every thing is fine.
if (adc_data[adc_data_idx] < 0x7f00 )
HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_SET);
if (adc_data_idx >= ADC_DATA_SIZE)
{
if(hUsbDeviceHS.dev_state == USBD_STATE_CONFIGURED)
{
// if I don't call CDC_Transmit_HS, everything is fine.
ret = CDC_Transmit_HS((uint8_t *)(adc_data), ADC_DATA_SIZE * 2 );
if (ret != USBD_OK)
{
HAL_GPIO_WritePin(led1_GPIO_Port, led2_Pin, GPIO_PIN_SET);
}
}
adc_data_idx = 0;
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
}
}
貌似单次USB传输会超过5us(一个转换时间),所以我停止了PWM信号来停止转换...
如果我只发送数据缓冲区的后半部分,则不会出现数据混合。这很奇怪。
根据您的描述,我认为处理是正确的,问题出在CDC_Transmit_HS()
;我在CDC_Transmit_FS()
遇到问题,原来的代码无法传输超过64字节的数据,需要修改一些代码,否则会出现一些错误。您检查接收到的数据数量是否正确?
参考:
我不确定你的 ADC_DATA_SIZE
尺码;如果大于64字节,也许你可以修改为小于64字节,再试一次,检查数据是否正确。我不确定是否受此问题影响,但我认为您可以尝试一下。
另一方面,可能还需要将AD7606未使用的ADC IN引脚接地,以避免通道间干扰。
或者您可以尝试其他通信方式(I2C、SPI、UART...等)来发送数据。
如果其他通讯方式没有问题,那么很有可能是CDC_Transmit_HS()
的问题。如果其他传输方式有问题,可能要检查ADC转换时间和传输时间是否有冲突。