Занимаюсь проектом: Блок питания с микроконтроллерным управлением который содержит следующие качества
1. Кнопочное регулирование напряжения 0-25
с шагом 0.1 и 1 В
2. Измерение напряжения и тока и вывод на 3-х сегментный LED
3. Макс ток нагрузки ~3-4А.
4. Регулируемая защита по току
5. Звуковой сигнал при замыкании + и -
Хотел уточнить как правильно инициализировать АЦП
Включать прерывание по завершению преобразования?
А то в PROTEUS если ставить с прерыванием то он показывает только текущее значение напряжения. Т.е. показания не меняются при изменении напряжения. Изменение происходит только после OFF-ON
Или это дело в симуляторе?
Блок питания с микроконтроллерным управлением
- Реклама
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
А вот "умный" БП на ATmega169 - http://www.circuitcellar.com/archives/v ... 06/12.html
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Мышонок
- Друг Кота
- Сообщения: 3792
- Зарегистрирован: Чт сен 14, 2006 11:42:09
- Откуда: Обитаю на чердаке
- Контактная информация:
Смотрите статью: http://www.radiokot.ru/circuit/digital/measure/09
и тему по ней: http://www.radiokot.ru/forum/viewtopic.php?t=5162
и тему по ней: http://www.radiokot.ru/forum/viewtopic.php?t=5162
Память очень интересная штука: бывает так, что запомнишь одно, а вспомнишь другое...
Вот пример инициализации и использования АЦП на асме для 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 **********
инициализация:
;*************** 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 **********
Всё просто как самогонный аппарат
Да понятно в 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, то в протеусе на индикаторе кракозябры
(может на железе будет нормально?)
Как заставить делать преобразование многократно?
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, то в протеусе на индикаторе кракозябры
(может на железе будет нормально?)
Как заставить делать преобразование многократно?
- Реклама
Почему вычисления верны если они обрабатываются в прерывании?
Если я их вынощу из прерывания то начинает показывать всякую всячину?
Т.Е. если делаю вот так:
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;
Помогите пожалуйста разобраться
Если я их вынощу из прерывания то начинает показывать всякую всячину?
Т.Е. если делаю вот так:
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;
Помогите пожалуйста разобраться
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Надо код сравнить
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru


