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

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт сен 01, 2009 09:54:47

Сообщение 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))
}
Последний раз редактировалось ILIS Вт мар 26, 2013 09:32:42, всего редактировалось 1 раз.
Реклама
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт сен 01, 2009 09:54:47

Сообщение ILIS »

Сам спросил, сам ответил - дребезг контактов и какие-то наводки видимо из-за мотора (т.к. без него работает стабильнее)
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 320
Зарегистрирован: Вс ноя 21, 2010 19:35:42
Откуда: Москва

Сообщение pashka000 »

Нога, на которой висит кнопка, резистором подтянута к неактивному уровню? Встроенных в МК подтягивающих резисторов иногда оказывается недостаточно, поэтому стоит подтянуть к шине питания все сконфигурированные на вход порты резисторами 1..5 кОм. (если, конечно, особенности схемы не накладывают требование на работу этих выводов в высокоимпедансном состоянии) Обязательно проделать это с ресетом. Между ним и землей можно установить еще и керамический конденсатор емкостью 0,1..0,5 мкФ. Между выводами питания тоже обязателен керамический конденсатор емкостью около 0,1 мкФ.
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт сен 01, 2009 09:54:47

Сообщение ILIS »

Спасибо, Пашка!
Нога не подтянута, использую всроенный пулап (на ноге высокий в неактивном). Ресет 10к на питание, иначе схема не заведется просто ) а на землю кондей зачем? Между выводами питания стоит 10мкФ керамики (он же - выход от степ-ап конвертора). Нужен еще и 100нФ?
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 320
Зарегистрирован: Вс ноя 21, 2010 19:35:42
Откуда: Москва

Сообщение pashka000 »

Нет, если по питанию уже есть керамика - еще одна, пожалуй, не нужна. Остается только поставить ее максимально близко к МК. У керамики паразитная индуктивность относительно небольшая, в отличие от электролитов - поэтому параллельно электролитам керамику ставят.
А конденсатор между ресетом и землей немножко затягивает появление высокого уровня на ресете. Получается, он отпускается, когда питание МК с большой вероятностью уже установилось.
Но раз у вас при запрете прерываний все приходит в норму, сдается мне, не справляется встроенный pull-up на выводе с кнопкой. Попробуйте помочь ему внешним резистором :)
Реклама
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт сен 01, 2009 09:54:47

Сообщение ILIS »

Мне кажется, провод шумит на DC-DC преобразователь. Он идет сверху и по нему хорошие ток гуляют. если вношу железку между проводом и микрухой DC-DC, то все Ок ) Но буду еще тестировать...
Реклама
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт сен 01, 2009 09:54:47

Сообщение ILIS »

Итак, все просто. Странно, что раньше не подумал.
Для того, чтобы нормально управлять щеточным мотором через транзистор (и вообще, любое реле) его включают последовательно с индуктивностью. правда не знаю, как ее грамотно рассчитать.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

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

Вернуться в «AVR»