Сообщение от LoKeR_95
|
Доброго времени суток, у меня такая задача измерить данные из 1-го АЦП используя 2 канала и данные сохранять в DMA. Значения 1-го канала сохр. в одну переменную а другой в другую. Это задача для измерения напряжения и тока. Я ни как не могу собрать не могу добавить 2 канал. Подскажите пожалуйста, как можно решить эту проблему
Нажмите, чтобы открыть спойлер
|
Код:
|
void init_adc() // АЦП
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1EN, ENABLE);
ADC1-›SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);
ADC1-›CR2 |= ADC_CR2_JEXTSEL;
ADC1-›CR2 |= ADC_CR2_JEXTTRIG;
ADC1-›CR2 |= ADC_CR2_CONT;
ADC1-›CR1 |= ADC_CR1_JAUTO;
ADC1-›JSQR |= (1‹‹18);
ADC1-›CR2 |= ADC_CR2_ADON;
ADC1-›CR2 |= ADC_CR2_JSWSTART;
while (!(ADC1-›SR & ADC_SR_JEOC));
} |
|
В вашем коде вы выбираете для преобразования инжектированные каналы (точнее - один инжектированный канал). Для них применение ДМА смысла не имеет - и так данные с каждого канала попадают в свой отдельный регистр ADC_JDRx. Для включения еще одного канала в группу инжектированных просто установите нужные биты в ADC1-›JSQR.
Биты JL в ADC1-›JSQR определяют, сколько преобразований должен сделать АЦП: по умолчанию стоит 00 - одно преобразование, в канале, определяемом битами JSQ4 (в которых у вас установлен один канал для измерения. Вам же надо поставить JL в 01 (два преобразования, в каналах, определяемых битами JSQ4 и JSQ3 (в которых вам надо установить другой канал для измерения). Описание ADC1-›JSQR в даташите в помощь.
Если же вы хотите использовать именно DMA, имеет смысл настроить АЦП на работу с регулярными каналами. Тогда все результаты измерений будут падать в один общий регистр данных, адрес которого будет адресом источника в настройке DMA, а DMA уже будет раскидывать результаты измерений в массив переменных. Что даст возможность автоматически делать по несколько измерений подряд для усреднения результатов.