×

Внимание

Форум находится в режиме только для чтения.

АЦП совместная работа регулярных и инжектированных каналов

11 года 7 мес. назад - 11 года 7 мес. назад #4250 от Stepanov Ivan
Денис, вопрос к вам. Подскажите пожалуйста, запустил на контроллере STM32F107, ацп1, один регулярный и один инжектированный канал. И все бы хорошо, но я оратил внимание что при включенном инжектированном канале, на обой каналах получается ошибочное значение. Как - непойму. Конвертация инжектированным каналом проводится сразу после конвертации регулярным каналом. Завел все это дело с использованием ДМА.
Попробовал побаловаться с временами Sample time, не помогло.

Процедуру инициализации АЦП привел ниже:

void ADC_Configuration()
{
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel11 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5

/*ADC1 channel2 config*/
ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);

ADC_AutoInjectedConvCmd(ADC1, ENABLE);

/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);

/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);

/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);

/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));

/* Start ADC1 Software Conversion */
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

а вот процедура настройки ДМА:

void DMA_Configuration(void)
{
/* DMA1 channel1 configuration
*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
}

подскажите пожалуйста, заранее спасибо.
11 года 7 мес. назад #4252 от Денис Ягов
Мало данных.

1. Что значит неправильное значение?

2. Чем у вас запускается инжектированное преобразование?

3. ДМА имеет возможность реагировать только на "регулярное преобразование". Инжектированное - в выделенном регистре хранится. Соответственно где вы смотрите результаты преобразовани?


Ну и общая рекоммендация. При поиске ошибок - упрощать программу. Уберайте ДМА. Убирайте инжектированный канал. Смотрите регистры АЦП напрямую. Потом, после достижения правильной работы - наращивайте периферию дальше (в обратном порядке).
11 года 7 мес. назад #4253 от Stepanov Ivan
Ну во - первых, неправильное значение значит что я мультиметром вижу одно, а в регистре (замечу соответствующем, т.е. для инжектированного канала свой а для регулярного свой, как вы знаете) другое значение;
во-вторых, инжектированное преобразование запускается автоматически, после каждого преобразования регулярного канала;
в третьих, про дма знаю, поэтому отдельно опрашиваю регистр данных инжектированного канала.

А по поводу отключения лишнего - отключаю инжектировванный канал - значения приходят в норму, включаю - уплывают. По этому собсно и вопрос.
11 года 7 мес. назад #4254 от Денис Ягов
попробуйте ещё так насторить до запуска АЦП

ADC_InjectedDiscModeCmd (ADC1, ENABLE)
11 года 6 мес. назад #4265 от Stepanov Ivan
Отказался от затеи использовать инжектированный канал, использую 2 регулярных, и заметил, что, пусть в меньшей степени, но тоже проявляется эффект взаимного влияния, в следствии чего вижу отклонение от реального значения на порту. Денис, вы случайно с такой ситуацией не сталкивались? как эту ошибку можно исключить?
11 года 6 мес. назад #4267 от Stepanov Ivan
Решил проблему! увеличил время измерения АЦП вместо 1.5 циклов использую 7.5, получается достаточно точно. Но не стоит слишком увеличивать время преобразования АЦП, получается ну очень большая ошибка, по крайней мере в моем проекте;D Всем спасибо, все свободны ;D
Время создания страницы: 0.038 секунд
Работает на Kunena форум