Шим и индикатор разряда Attiny13

5vn
Offline
Зарегистрирован: 26.03.2020

Здравствуйте уважаемые форумчане, понадобилось мне собрать компактное устройство на аттини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); // выключаем светодиод
}

 

5vn
Offline
Зарегистрирован: 26.03.2020

Извините устал, схему накидал быстро и забыл нарисовать резистор 100ом на светодиод, с ним потребление диода 9милиампер и диод между ног мотора катодом к +, анодом к -.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А что ты пытаешься сделать в строке 41 ?

5vn
Offline
Зарегистрирован: 26.03.2020

Записываю значение полученное на выходе ацп в регистр сравнения таймера, устанавливая скважность тем самым, ну и нижнюю границу чуть отсек ибо тяжело на резисторе абсолютный ноль получить, сильно вдавливать надо.

5vn
Offline
Зарегистрирован: 26.03.2020

Разобрался сам, случайно, поставив конденсатор вместо 0,1 на 1мкф тини перестала болеть и стала четко работать, первый раз такое, я эти кондеры обычно от балды ставлю, видимо при открытии транзистора были пульсации и 0.1 не хватало.