Вопрос из разряда песочницы, но видимо забыл все (или не знал)).
Хочу сделать зарядное уст. из промышленного обратноходового БП, где напряжение стабилизируется штатной ОС БП, а стабилизацию тока (точнее ограничение) хочу реализовать с помощью ШИМ+АЦП МК Attiny85.
Схема:
Код:
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <Wire.h>
volatile int adc_l;
volatile int adc_HL;
volatile float adc_val;
//границы переменных
int grany (int peremen, int a1, int b1) {
if (peremen<=a1) {peremen=a1;}
if (peremen>=b1) {peremen=b1;}
return peremen;
}
int OCR1A_plus () {
if (OCR1A>=253) {OCR1A=254;}
else {OCR1A++;}
return 0;
}
int OCR1A_minus () {
if (OCR1A<=2) {OCR1A=0;}
else {OCR1A--;}
return 0;
}
int main (void) {
DDRB|=1<<PB1|0<<PB4;
//~~~~~~~~~~~~~~~~~~~~~~~~ШИМ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// |состояние выхода OC1A| вкл.PWM| 4 бита предделителя частоты|
TCCR1=0<<COM1A1|1<<COM1A0|1<<PWM1A|1<<CS10|1<<CS11|1<<CS12|0<<CS13;
OCR1A=200;//установка скважности
//~~~~~~~~~~~~~~~~~~~~~~~~АЦП~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// ист. опорного напр. 2.56V| выбор канала АЦП ADC1 (PB4) |
ADMUX|= 0<<REFS0|1<<REFS1|1<<REFS2|0<<MUX0|1<<MUX1;//|0<<MUX2|0<<MUX3;
// вкл.АЦП|авт. режим|старт |предделитель частоты АЦП на 128 |
ADCSRA|=1<<ADEN|1<<ADATE|1<<ADSC|0<<ADPS0|1<<ADPS1|1<<ADPS2;
while(1){
adc_l=ADCL; //значение входного напряжения в нижнем регистре
adc_HL=(ADCH<<8)|adc_l;//чтение верхнего регистра вместе с нижним
adc_val = int(grany(adc_HL,0,1023));
if (adc_val>400) {OCR1A_minus();} else {OCR1A_plus ();}
}
}
Но так эта ОС не работает. Почему?