- Главная
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- АЦП совместная работа регулярных и инжектированных каналов
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- АЦП совместная работа регулярных и инжектированных каналов
АЦП совместная работа регулярных и инжектированных каналов
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 7 мес. назад - 11 года 7 мес. назад #4250
от Stepanov Ivan
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);
}
подскажите пожалуйста, заранее спасибо.
Попробовал побаловаться с временами 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 мес. назад пользователем .
- Денис Ягов
- Посетитель
11 года 7 мес. назад #4252
от Денис Ягов
Денис Ягов ответил в теме Re: АЦП совместная работа регулярных и инжектированных каналов
Мало данных.
1. Что значит неправильное значение?
2. Чем у вас запускается инжектированное преобразование?
3. ДМА имеет возможность реагировать только на "регулярное преобразование". Инжектированное - в выделенном регистре хранится. Соответственно где вы смотрите результаты преобразовани?
Ну и общая рекоммендация. При поиске ошибок - упрощать программу. Уберайте ДМА. Убирайте инжектированный канал. Смотрите регистры АЦП напрямую. Потом, после достижения правильной работы - наращивайте периферию дальше (в обратном порядке).
1. Что значит неправильное значение?
2. Чем у вас запускается инжектированное преобразование?
3. ДМА имеет возможность реагировать только на "регулярное преобразование". Инжектированное - в выделенном регистре хранится. Соответственно где вы смотрите результаты преобразовани?
Ну и общая рекоммендация. При поиске ошибок - упрощать программу. Уберайте ДМА. Убирайте инжектированный канал. Смотрите регистры АЦП напрямую. Потом, после достижения правильной работы - наращивайте периферию дальше (в обратном порядке).
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 7 мес. назад #4253
от Stepanov Ivan
Stepanov Ivan ответил в теме Re: АЦП совместная работа регулярных и инжектированных каналов
Ну во - первых, неправильное значение значит что я мультиметром вижу одно, а в регистре (замечу соответствующем, т.е. для инжектированного канала свой а для регулярного свой, как вы знаете) другое значение;
во-вторых, инжектированное преобразование запускается автоматически, после каждого преобразования регулярного канала;
в третьих, про дма знаю, поэтому отдельно опрашиваю регистр данных инжектированного канала.
А по поводу отключения лишнего - отключаю инжектировванный канал - значения приходят в норму, включаю - уплывают. По этому собсно и вопрос.
во-вторых, инжектированное преобразование запускается автоматически, после каждого преобразования регулярного канала;
в третьих, про дма знаю, поэтому отдельно опрашиваю регистр данных инжектированного канала.
А по поводу отключения лишнего - отключаю инжектировванный канал - значения приходят в норму, включаю - уплывают. По этому собсно и вопрос.
- Денис Ягов
- Посетитель
11 года 7 мес. назад #4254
от Денис Ягов
Денис Ягов ответил в теме Re: АЦП совместная работа регулярных и инжектированных каналов
попробуйте ещё так насторить до запуска АЦП
ADC_InjectedDiscModeCmd (ADC1, ENABLE)
ADC_InjectedDiscModeCmd (ADC1, ENABLE)
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 6 мес. назад #4265
от Stepanov Ivan
Stepanov Ivan ответил в теме Re: АЦП совместная работа регулярных и инжектированных каналов
Отказался от затеи использовать инжектированный канал, использую 2 регулярных, и заметил, что, пусть в меньшей степени, но тоже проявляется эффект взаимного влияния, в следствии чего вижу отклонение от реального значения на порту. Денис, вы случайно с такой ситуацией не сталкивались? как эту ошибку можно исключить?
- Stepanov Ivan
- Автор темы
- Посетитель
11 года 6 мес. назад #4267
от Stepanov Ivan
Stepanov Ivan ответил в теме Re: АЦП совместная работа регулярных и инжектированных каналов
Решил проблему! увеличил время измерения АЦП вместо 1.5 циклов использую 7.5, получается достаточно точно. Но не стоит слишком увеличивать время преобразования АЦП, получается ну очень большая ошибка, по крайней мере в моем проекте;D Всем спасибо, все свободны ;D
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- АЦП совместная работа регулярных и инжектированных каналов
Время создания страницы: 0.058 секунд