|
是这样的,我的任务是要采集256个喷孔的对应信号,这256个喷孔都有一个点火信号,是1khz的方波。
然后我配置的ADC是1.9Mhz,开启的两倍过采样,当然,我关闭过采样也尝试过。都不对
就是外部上升沿接收这个点火信号(黄色的)之后触发中断,在中断函数里面进行任务通知ADC采集任务。
当采集完一个喷孔之后在DMA的回调函数里切换下一个喷孔。
现在的问题是采集出来的数据不对应。不知道是我的硬件没有硬实时吗?
这个如何验证呢?因为这个外部中断1khz的方波没法关闭,他从1-256循环完会自动再重新循环,所以我在ADC任务中采集够256个数组就进行任务自杀。
MPU,cache什么的都关闭掉了。
ADC配置:
hadc3.Instance = ADC3;
hadc3.Init.Resolution = ADC_RESOLUTION_16B;
hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc3.Init.LowPowerAutoWait = DISABLE;
hadc3.Init.ContinuousConvMode = ENABLE;
hadc3.Init.NbrOfConversion = 1;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc3.Init.OversamplingMode = ENABLE;
hadc3.Init.Oversampling.Ratio =2;
hadc3.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_1;
hadc3.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
hadc3.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
中断回调函数:
#define ADC_DATA_LENGTH 128 //定义采集数据长度
volatile uint32_t current_sample_index = 0; //当前采集的喷孔号
static uint16_t data[TOTAL_SAMPLES][ADC_DATA_LENGTH]; //256组
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { //外部中断回调函数
BaseType_t xGPIO_risingTaskWoken = pdFALSE;
if (GPIO_Pin == GPIO_PIN_1) {
vTaskNotifyGiveFromISR(ADCTaskHandle, &xGPIO_risingTaskWoken); //通知ADC采集任务
portYIELD_FROM_ISR(xGPIO_risingTaskWoken); //有必要的话进行任务切换
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
if (hadc->Instance == ADC3) {
HAL_ADC_Stop_DMA(&hadc3);
current_sample_index++; //每采集完一个喷孔切换下一个喷孔
}
}
ADC采集任务:
void ADCTask_Task(void *arg) {
TickType_t previousWakeTime = xTaskGetTickCount();
BaseType_t result;
while (1) {
result = ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
if (result == pdTRUE) {
HAL_ADC_Start_DMA(&hadc3, (uint32_t *)data[current_sample_index], ADC_DATA_LENGTH);
}
if (current_sample_index >= TOTAL_SAMPLES) { //采集完256个数组开始创建打印任务
xTaskCreate(PrintfTask,"PrintfTask",512,NULL,5,(TaskHandle_t *)&PrintfTaskHandle);
vTaskDelete(NULL);
}
}
}
|
|