Шим и индикатор разряда Attiny13
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые форумчане, понадобилось мне собрать компактное устройство на аттини13 с регулировкой шим сигнала для управления небольшим моторчиком с вентилятором от 18650 и индикатором (загорается светодиод) при разряде менее, ну пока взял 3,2-3,3 в.
Сразу оговорюсь, на языке ардуино иде могу написать не сложный скетч с подглядыванием в справку, на си кое как смог написать скетч для аттини, шил через иде, фьюзы проверял, пробовал 2 разные тини с 2х разных магазинов, из китая не заказывал ибо долго.
Основу кода взял с сайта osboy, админ очень помог, респект.
Ногу компаратора pb0 освободил для шима, перекинув на внутреннее опорное 1.1в для сравнения сигнала с pb1, на который в свою очередь идет делитель (поставил делитель 15ком на 7.5 ком), рассчетно на 3.3в сработка, фактически 3,22-3,23 в, меня устраивает. Вход с резистора pb4 и сравнение с напр. питания.
На макетке накидал без подключения транзистора и замерил шим осциллографом, все отлично, диод тоже срабатывает (поставил делитель 15ком на 7.5 ком), вытравил платку, купил смд корпус и запаялся уже с транзисторами и... Странная работа и потом вовсе отказ, отпаял, перепрошил, вставил в макетке и опять без транзистора шим есть, с ним нет, транзистор звонил, менял разные, ни в какую, при запуске стоит писк и потом тиня отрубается и пока не прошьешь заново признаков жизни не подает. Первые схемы на п-мосфете, который открывался н-мосфетом не буду выкладывать, выложу лишь последнюю собранную на одном н-мосфете и скетч:
#ifndef F_CPU #define F_CPU 1200000UL #endif #define LED PB2 // - выход светодиода #define PWM PB0 // OC0A - выход ШИМ #define ANALOG_IN PB4 // ADC2 - вход АЦП (регулировка ЩИМ) #define COMP_IN PB1 // AIN1 - вход компаратора (измерение U питания) #include <avr/io.h> #include <avr/interrupt.h> int main(void) { // Инициализация портов в/в: DDRB |= (1 << LED) | (1 << PWM); // выходы DDRB &= ~( (1 << ANALOG_IN) | (1 << COMP_IN) ); // входы PORTB &= ~( (1 << COMP_IN) | ( 1 << ANALOG_IN) | (1 << LED) | (1 << PWM) ); // по умолчанию на выходах 0, подтяжка входов отключена // Таймер для ШИМ: TCCR0A = 0b10000001; // режим коррекции фазы ШИМ, TOP 0xFF, неинверсный сигнал на выходе OC0A TCCR0B = 0b00000010; // режим коррекции фазы ШИМ, TOP 0xFF, предделитель тактовой частоты CLK/8 TCNT0 = 0; // начальное значение счётчика OCR0A = 0; // регистр совпадения A (начальное значение скважности на выходе ШИМ) // Настройка АЦП: ADMUX = 0b00100010; // опорное напряжение - VCC, левое ориентирование данных, выбран вход ADC2 (на нём висит перем. резистор) ADCSRA = 0b11101111; // АЦП включен, запуск преобразования, режим автоизмерения, прерывание по окончанию преобразования, частота CLK/128 ADCSRB = 0b00000000; // режим автоизмерения (постоянно запущено), мультиплексор компаратора отключен // Настройка компаратора: ACSR = 0b01001000; // используем внутреннее опорное напряжение 1.1В (освобождаем вывод PB0 для ШИМ), разрешаем прерывания по любому фронту ны выходе компаратора DIDR0 = 0b00010010; // выключаем цифровые буферы для портов AIN1 (PB1) и ADC2 (PB4) SREG |= (1<<SREG_I); // разрешаем прерывания глобально: sei(); while(1) {} // основной цикл } // Обработчик прерывания по завершению преобразования АЦП ISR(ADC_vect) { OCR0A = (ADCH < 5) ? 0 : ADCH; // устанавливаем скважность на выходе ШИМ } // Обработчик прерываний компаратора ISR(ANA_COMP_vect) { if ( (ACSR >> ACO) & 1 ) // если на выходе компаратора логическая ЕДИНИЦА (напряжение упало ниже опорного) PORTB |= (1 << LED); // включаем светодиод else // если на выходе компаратора логический НОЛЬ PORTB &= ~(1 << LED); // выключаем светодиод }
Извините устал, схему накидал быстро и забыл нарисовать резистор 100ом на светодиод, с ним потребление диода 9милиампер и диод между ног мотора катодом к +, анодом к -.
А что ты пытаешься сделать в строке 41 ?
Записываю значение полученное на выходе ацп в регистр сравнения таймера, устанавливая скважность тем самым, ну и нижнюю границу чуть отсек ибо тяжело на резисторе абсолютный ноль получить, сильно вдавливать надо.
Разобрался сам, случайно, поставив конденсатор вместо 0,1 на 1мкф тини перестала болеть и стала четко работать, первый раз такое, я эти кондеры обычно от балды ставлю, видимо при открытии транзистора были пульсации и 0.1 не хватало.