timer - 在 STM32F4 中收集从脉冲上升沿到下降沿的 ADC 值(设置 ADC 转换次数)
问题描述
我正在使用 DMA 收集 STM32F4 微控制器中的 ADC 数据。ADC 数据现在配置为单一模式,ADC 在脉冲的上升沿触发(我使用 TIM8 进行脉冲生成,脉冲可以设置为 10us 到 400us,我也使用相同的 TIM8 进行上升边沿 ADC 触发)。
ADC 的转换时间约为 3us。所以在 10us 脉冲期间,我大约得到 3 个 ADC 值,所以如果我设置 10us 脉冲,那么 ADC 值收集应该在脉冲的下降沿停止,这样对于 10us 脉冲我将有大约 3 个 ADC 值。
那么是否可以将 ADC 配置为在脉冲的上升沿开始并在脉冲的下降沿停止。
注意:-代码现在在上升沿触发的单模式下工作正常,其中仅捕获一次 ADC 值,而与脉冲持续时间无关,但是在连续模式下,我希望它从上升沿转换和收集数据直到脉冲的下降沿,然后停止 ADC
// this is my ADC and DMA initialization code.
void cADCReadout::initialize(sADCInitStruct init)
{
m_sInitStruct = init;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
//DMA
DMA_InitStructure.DMA_Channel = init.DMAChannel;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(init.ADCChannel->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&m_aRecBuffer);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 0;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(init.DMAStream, &DMA_InitStructure);
DMA_Cmd(init.DMAStream, ENABLE);
//ADC
ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode =ADC_DMAAccessMode_1;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising ;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_TRGO;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion =1;
ADC_Init(init.ADCChannel, &ADC_InitStructure);
ADC_EOCOnEachRegularChannelCmd(init.ADCChannel, DISABLE);
/* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(init.ADCChannel, ENABLE);
}
解决方案
推荐阅读
- java - AbstractApplicationContext 尚未刷新异常
- delphi - 如何将记录或类类型存储在集合中并转换为 TObject
- javascript - .text() 删除 html 标记时连接不带空格的字符串
- neo4j - 合并而不是 CREATE 用于 apoc.create.relationship()
- r - networkD3 中 sankeyNetwork 的绘图不显示输出,也不在 R 中生成任何警告/错误
- sql-server - Dpac 文件 - 错误
- google-places-api - 查找地点请求仅返回一个结果
- stored-procedures - 将 varchar 值“1,2”转换为数据类型 int 时转换失败
- php - 多个条件用php替换mysql记录
- ios - Interface Builder 以什么顺序评估 IBInspectables?