14.10.2013, 12:33
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
STM32F051x6 - переключение каналов ADC
проблема с измерением двух каналов STM32F051x6. использую единичные преобразования: программа работает так: после того как все инициализировано:
while((ADC1-›CR&ADC_CR_ADSTART)!=0){}; //это условие должно выполняться перед сменой канала
ADC1-›CHSELR=ADC_CHSELR_CHSEL1; //выставляем вход ADC1_IN1(PA1)
ADC1-›CR|=ADC_CR_ADSTART; //старт преобразов.
while((ADC1-›ISR&ADC_ISR_EOSEQ)!=ADC_ISR_EOSEQ){}; //ожидание преобазов.
temp1=(float)ADC1-›DR; //забираем преобразования с первого канала
while((ADC1-›CR&ADC_CR_ADSTART)!=0){}; //это условие должно выполняться перед сменой канала
ADC1-›CHSELR=ADC_CHSELR_CHSEL3; //выставляем вход ADC1_IN2(PA3)
ADC1-›CR|=ADC_CR_ADSTART; //старт преобразов.
while((ADC1-›ISR&ADC_ISR_EOSEQ)!=ADC_ISR_EOSEQ){}; //ожидание преобазов.
temp2=(float)ADC1-›DR; //забираем преобразования с второго канала
при такой вот работе программы temp1 = 1998 и сильно дребезжит при "0" на входе. если закоментировать ADC1-›CHSELR=ADC_CHSELR_CHSEL3; - тоесть перестать переключать каналы - измерения происходят правильно - почти "0" при "0В" на входе и "4095" при "3.3В" на входе. я как то неправильно использую единичные преобразования?
__________________
Kvsrk85(Андрей)
|
|
|
|
14.10.2013, 14:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,772
Сказал спасибо: 123
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: STM32F051x6 - переключение каналов ADC
kvark85, я перед сменой канала сбрасываю регистр ADC1-›CHSELR.
ADC1-›CHSELR = (uint32_t)0x0000; //Очистка выбора всех каналов
и потом выбираю канал
ADC1-›CHSELR |= (uint32_t)ADC_ch_1; //Выбор 1 канала
сбрасываю флаг окончания измерений
ADC_ClearFlag(ADC1,ADC_FLAG_EOC); //Очистка флага окончания измерений
и так далее.
Короче
LED_ch1_On; //
delay_led(); //
ADC1-›CHSELR = (uint32_t)0x0000; //
ADC_ClearFlag(ADC1,ADC_FLAG_EOC); //
ADC1-›CHSELR |= (uint32_t)ADC_ch_1; //
ADC_StartOfConversion(ADC1); //
while((ADC1-›ISR & ADC_FLAG_EOC) != ADC_FLAG_EOC) {} //
LED_ch1_Off; //
LED_ch2_On; //
rez_adc_1 = ADC_GetConversionValue(ADC1); //
комментарии удалил из-за кодировки
|
|
|
|
14.10.2013, 14:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,772
Сказал спасибо: 123
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: STM32F051x6 - переключение каналов ADC
Я дожидаюсь окончания
while((ADC1-›ISR & ADC_FLAG_EOC) != ADC_FLAG_EOC) {} //
по флагу ADC_FLAG_EOC. Может потому при пошаговой отладке хватает времени?
ADC_ISR_EOSEQ флаг окончания преобразований сегмента.
|
|
|
|
14.10.2013, 14:49
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F051x6 - переключение каналов ADC
kvark85, andries5, код то можно нормально оформить?
__________________
Осторожно , злой кот
|
|
|
|
14.10.2013, 14:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,772
Сказал спасибо: 123
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
|
Re: STM32F051x6 - переключение каналов ADC
Прошу прощения, поторопился.
|
|
|
Сказали "Спасибо" andries5
|
|
|
14.10.2013, 15:33
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: STM32F051x6 - переключение каналов ADC
dosikus, тоже извиняюсь за код.
к andries5 - ADC_ISR_EOSEQ флаг окончания преобразований сегмента, правильно. и именно его я использовал для ожидания преобразования, так как в сегменте у меня одно преобразование. Смотрю в IAR при отладке - после преобразования выставляется именно EOSEQ, а ADC_FLAG_EOC не выставляется. попробовал на всякий случай написать так:
while(((ADC1-›ISR&ADC_ISR_EOSEQ)==0) || ((ADC1-›ISR&ADC_IER_EOCIE)==0)){};
(думаю одну строчку не надо было как код вставлять)).
Не знаю насколько такая строчка правильная в данном случае - но так - работает.
Кстати, вот перепроверил, так:
while((ADC1-›ISR&ADC_IER_EOCIE)==0){}; - тоже работает. В общем - неправильно я ожидание преобразования делал. Разобрался вроде.
__________________
Kvsrk85(Андрей)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:26.
|
|