Обсуждаем цифровые устройства...
Ответить

Блок питания с микроконтроллерным управлением

Сб сен 22, 2007 13:40:17

Занимаюсь проектом: Блок питания с микроконтроллерным управлением который содержит следующие качества
1. Кнопочное регулирование напряжения 0-25
с шагом 0.1 и 1 В
2. Измерение напряжения и тока и вывод на 3-х сегментный LED
3. Макс ток нагрузки ~3-4А.
4. Регулируемая защита по току
5. Звуковой сигнал при замыкании + и -

Хотел уточнить как правильно инициализировать АЦП
Включать прерывание по завершению преобразования?
А то в PROTEUS если ставить с прерыванием то он показывает только текущее значение напряжения. Т.е. показания не меняются при изменении напряжения. Изменение происходит только после OFF-ON
Или это дело в симуляторе?

Сб сен 22, 2007 15:47:43

А вот "умный" БП на ATmega169 - http://www.circuitcellar.com/archives/viewable/Popov206/12.html

Сб сен 22, 2007 18:22:58

Смотрите статью: http://www.radiokot.ru/circuit/digital/measure/09
и тему по ней: http://www.radiokot.ru/forum/viewtopic.php?t=5162

Вс сен 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
Вот в нем-то и хранится результат АЦП
Ответить