Обсуждаем цифровые устройства...
Сб сен 22, 2007 13:40:17
Занимаюсь проектом: Блок питания с микроконтроллерным управлением который содержит следующие качества
1. Кнопочное регулирование напряжения 0-25
с шагом 0.1 и 1 В
2. Измерение напряжения и тока и вывод на 3-х сегментный LED
3. Макс ток нагрузки ~3-4А.
4. Регулируемая защита по току
5. Звуковой сигнал при замыкании + и -
Хотел уточнить как правильно инициализировать АЦП
Включать прерывание по завершению преобразования?
А то в PROTEUS если ставить с прерыванием то он показывает только текущее значение напряжения. Т.е. показания не меняются при изменении напряжения. Изменение происходит только после OFF-ON
Или это дело в симуляторе?
Вс сен 23, 2007 07:03:09
Вот пример инициализации и использования АЦП на асме для AVR:
инициализация:
;*************** ADC ***************
ldi tmph,0b10001110 ;режим и частота АЦП
out adcsr,tmph
ldi tmph,0b01000000 ;мультиплексор и ИОН
out admux,tmph
;ldi tmph,0b00010000 ;повышение скорости преобразования но 8 бит
;out sfior,tmph
;*************** ADC ***************
использование (прерывание от АЦП):
;********************** АЦП *************************
adc_0:
push tmph
in vrm1,sreg
push vrm1
in ADCg,ADCL ;считывание младшего байта
in common,ADCH ;считывание старшего байта
sbi adcsr,adsc ;запуск следующего преобразования
pop vrm1
out sreg,vrm1
pop tmph
reti
;********************** АЦП ********** END **********
Вс сен 23, 2007 10:37:56
Да понятно в CVAVR вот так:
interrupt [ADC_INT] void adc_isr(void){
Vizm=ADCW;
Vpr = (float) Vizm;
Vpr = Vpr * 0.03128;
Vdec = (int) Vpr;
Vpr = Vpr - (float) Vdec;
Vpr = Vpr * 1000;
Vmili = (int) Vpr;
}
Дальше преобразовываю в BCD и вывожу на LED.(ADCSRA=0b11011111;
ADMUX=0b11000000
Но он делает преобразование 1 раз и останавливается.
Если установить ADFR=1, то в протеусе на индикаторе кракозябры
(может на железе будет нормально?)
Как заставить делать преобразование многократно?
Вс сен 23, 2007 11:36:09
Почему вычисления верны если они обрабатываются в прерывании?
Если я их вынощу из прерывания то начинает показывать всякую всячину?
Т.Е. если делаю вот так:
interrupt [ADC_INT] void adc_isr(void){
adc_data=ADCW;
}
.....
void main(void)
{
ADMUX=0b11000000;
ADCSRA=0b11011111;
#asm("sei")
while(1)
{
Vizm=adc_data ;
Vpr = (float) Vizm;
Vpr = Vpr * 0.03128;
Vdec = (int) Vpr;
Vpr = Vpr - (float) Vdec;
Vpr = Vpr * 1000;
Vmili = (int) Vpr;
Помогите пожалуйста разобраться
Вс сен 23, 2007 11:58:47
Надо код сравнить
Вс сен 23, 2007 12:58:06
К сожалению си незнаю но на асме необходимо считать сначала младший байт из ацп, а затем старший. Но не наоборот. Бился над этим 2 дня. Возможно у тебя что-нибуть подобное.
Вс сен 23, 2007 14:12:32
От асма отличается только тем что здесь результат хранится в виртуальном 16-битном регистре ADCW
Вот в нем-то и хранится результат АЦП
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.