Страница 1 из 1

Помогите с attiny13a (глючит, если сменить частоту 6к->9.6М)

Добавлено: Пн мар 25, 2013 13:24:45
ILIS
Привет коты :)
Есть простенькая схемка: тинька, степап до 5В, светодиод, кнопка и моторчик с ключом.
Все хорошо работало на частоте 600кГц. Но мне не нравился ВЧ писк от мотора (ШИМ), решил поднять частоту тиньки до 9.6МГц.
Прошил фьюзы, подправил makefile, все прошилось, но вот беда, стало все глючить. Постучишь по попроводкам - и тинька то ресетнется, то прервется... в общем крайне не стабильно работает. Я уже и провода поменял все, и плату новую с более толстыми дорожками и экраном под тинькой развел, и степап убирал (думал он шумит) и все равно, на 600кГц работает как часы, на 9.6 - не работает (точнее не стабильно очень).
Заметил, если в программе убрать прерывания, то работает хорошо, но как же кнопка? Мне бы управлять )))

Помогите разобраться, почему так происходит? Писал на С в WinAVR 20100110
СпойлерПрограмму упростил до самого простого:
Логика:
мотор должен стартануть быстро, потом снизится до какого-то порога и постепенно раскручиваться - и так бесконечно, пока не сядет батарейка (контроль за напряжением тоже есть). Ну и по нажатию кнопки упростил до того, что светик мигает...

Если закоментить PCMSK = _BV(BUTTON_INT); - то в железе работает (кроме кнопки)

Код: Выделить всё

/*****************************************************
Set clock and other fuses
600kHz
avrdude -p attiny13 -P usb -c avrisp2 -U lfuse:w:0x29:m -U hfuse:w:0xff:m
9,6MHz
avrdude -p attiny13 -P usb -c avrisp2 -U lfuse:w:0x3A:m -U hfuse:w:0xff:m
*****************************************************/

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>

#define RED _BV(PB2)
#define GREEN _BV(PB1)
#define MOTOR _BV(PB0)
#define BUTTON PB4
#define BUTTON_INT PCINT4

#define OCRA_LOW 235
#define OCRA_STEP 1

#define UP 1
#define DOWN 0

volatile uint8_t button_state = UP;

ISR(PCINT0_vect)
{
    if (!bit_is_set(PINB,BUTTON))
    {
		PORTB ^= RED;
        button_state = DOWN;
    }
	else
	{
		button_state = UP;
	}
}

int main(void)
{
    DDRB = RED|GREEN|MOTOR;

    //----------------TIMER--------------
    TCCR0A = 
    _BV(WGM00)|_BV(WGM01)|// Fast-PWM mode
    _BV(COM0A1);//|_BV(COM0A1); //Set OC0A on Compare Match, clear OC0A at TOP

    TCCR0B = _BV(CS00);//|_BV(CS02);// таймер работает без предделителя
    GIMSK = _BV(PCIE);
    PCMSK = _BV(BUTTON_INT);
    asm("sei"); // Разрешаем прерывания

	TCCR0A |= _BV(COM0A1);

    while (1) {
		OCR0A = 0xff;
		_delay_ms(60);
		for(OCR0A = OCRA_LOW; OCR0A < 0xff; OCR0A++)
		{
			_delay_ms(200);
		}
    }
    TCCR0A &= ~(_BV(COM0A1))
}

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Вт мар 26, 2013 09:31:35
ILIS
Сам спросил, сам ответил - дребезг контактов и какие-то наводки видимо из-за мотора (т.к. без него работает стабильнее)

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Пн апр 01, 2013 00:40:41
pashka000
Нога, на которой висит кнопка, резистором подтянута к неактивному уровню? Встроенных в МК подтягивающих резисторов иногда оказывается недостаточно, поэтому стоит подтянуть к шине питания все сконфигурированные на вход порты резисторами 1..5 кОм. (если, конечно, особенности схемы не накладывают требование на работу этих выводов в высокоимпедансном состоянии) Обязательно проделать это с ресетом. Между ним и землей можно установить еще и керамический конденсатор емкостью 0,1..0,5 мкФ. Между выводами питания тоже обязателен керамический конденсатор емкостью около 0,1 мкФ.

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Пн апр 01, 2013 09:31:11
ILIS
Спасибо, Пашка!
Нога не подтянута, использую всроенный пулап (на ноге высокий в неактивном). Ресет 10к на питание, иначе схема не заведется просто ) а на землю кондей зачем? Между выводами питания стоит 10мкФ керамики (он же - выход от степ-ап конвертора). Нужен еще и 100нФ?

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Пн апр 01, 2013 23:32:43
pashka000
Нет, если по питанию уже есть керамика - еще одна, пожалуй, не нужна. Остается только поставить ее максимально близко к МК. У керамики паразитная индуктивность относительно небольшая, в отличие от электролитов - поэтому параллельно электролитам керамику ставят.
А конденсатор между ресетом и землей немножко затягивает появление высокого уровня на ресете. Получается, он отпускается, когда питание МК с большой вероятностью уже установилось.
Но раз у вас при запрете прерываний все приходит в норму, сдается мне, не справляется встроенный pull-up на выводе с кнопкой. Попробуйте помочь ему внешним резистором :)

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Чт апр 04, 2013 10:53:32
ILIS
Мне кажется, провод шумит на DC-DC преобразователь. Он идет сверху и по нему хорошие ток гуляют. если вношу железку между проводом и микрухой DC-DC, то все Ок ) Но буду еще тестировать...

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Вт май 14, 2013 14:50:03
ILIS
Итак, все просто. Странно, что раньше не подумал.
Для того, чтобы нормально управлять щеточным мотором через транзистор (и вообще, любое реле) его включают последовательно с индуктивностью. правда не знаю, как ее грамотно рассчитать.

Re: Помогите с attiny13a (глючит, если сменить частоту 6к->9

Добавлено: Вт май 21, 2013 15:21:24
Alexeyslav
провода от конденсатора преобразователя до питания контроллера вполне достаточно чтобы там гуляли импульсные помехи по напряжению, поэтому керамический конденсатор на питание контроллера - обязательно, либо через дорожки питания контроллера и вблизи не проводить силовые провода. Лучше бы для надежности все неиспользуемое пространство заливать полигоном земли, он погасит все наведенные токи до того как они воздействуют на слаботочные цепи.

На мотор еще можно повесить снабберную цепочку из конденсатора и резистора, это уменьшит импульсы "отдачи" и уровень помех.