Помогите выбрать контроллер

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
KIVi
Встал на лапы
Сообщения: 126
Зарегистрирован: Вс янв 27, 2013 19:02:19

Помогите выбрать контроллер

Сообщение KIVi »

Нужен контроллер (AVR или PIC), который бы удовлетворял 3 требованиям:

1) Имел 4 16-битных ШИМ-канала
2) Имел аппаратный I2C с поддержкой режима Slave
3) Был в DIP-корпусе

Либо подойдёт просто ШИМ-контроллер с 4 каналами, I2C интерфейсом и DIP-корпусом.
Проблема выбора осложняется тем, что не хотелось бы заказывать детали, а купить в местном радиомагазине, а там выбор немного ограничен.

Что можете посоветовать (разумеется, для такого применения мне не нужен контроллер с сотней килобайт флеша - мне нужен вариант подешевле)?
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Помогите выбрать контроллер

Сообщение uk8amk »

Из распространенных AVR 2 16-битных таймера и 5 ШИМ каналов есть начиная с ATmega64. Но он в дип не бывает.
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Помогите выбрать контроллер

Сообщение Gudd-Head »

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
KIVi
Встал на лапы
Сообщения: 126
Зарегистрирован: Вс янв 27, 2013 19:02:19

Re: Помогите выбрать контроллер

Сообщение KIVi »

В общем, решил использовать attiny2313, на которой реализовать программный ШИМ. Мне хватит и разрешения немного меньше 16 бит.
Вроде работает, но хотелось бы услышать ваше мнение, а то вдруг в коде есть какая-нибудь ошибка, которая проявится потом в самый неподходящий момент. Итак, всего у меня 4 канала ШИМ, подключенные к PB1, PB2, PB3 и PB4. Количество вариантов коэффициента заполнения - 4000, ибо в принципе для моей задачи хватит и такого. Тактуется МК от внешнего кварца на 16 МГц. Значения ШИМ хранятся в массиве pwm_values. После изменения вызывается функций pwm_update, которая переносит их в отсортированный массив для обработчика прерывания.

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

typedef struct {
	unsigned int ocr;
	unsigned char mask;
} PwmValue;

unsigned char cur_pwm;
unsigned int pwm_values[4];
PwmValue pwm_values_sorted[5];

void pwm_init() {
	DDRB |= _BV(1) | _BV(2) | _BV(3) | _BV(4);
	TIMSK |= _BV(TOIE1) | _BV(OCIE1A);
}

void pwm_enable() {
	TCNT1 = 65536 - 40000;
	TCCR1B = _BV(CS11);
}

void pwm_disable() {
	TCCR1B = 0;
	PORTB &= ~(_BV(1) | _BV(2) | _BV(3) | _BV(4));
}

ISR(TIMER1_OVF_vect) {
	TCNT1 = 65536 - 40000;
	PORTB |= _BV(1) | _BV(2) | _BV(3) | _BV(4);
	cur_pwm = 0;
	OCR1A = pwm_values_sorted[0].ocr;
}

ISR(TIMER1_COMPA_vect) {
	PORTB &= pwm_values_sorted[cur_pwm].mask;
	cur_pwm++;
	OCR1A = pwm_values_sorted[cur_pwm].ocr;
}

void pwm_update() {
	unsigned char i, j, k = 0;
	PwmValue tmp[5];
	memset(tmp, 0, sizeof(tmp));
	for (i = 0; i < 4; i++) {
		unsigned int ocr = 65536 - 40000 + pwm_values[i] * 10;
		for (j = 0; j < k; j++) {
			if (tmp[j].ocr >= ocr) break;
		}
		if (tmp[j].ocr == ocr) {
			tmp[j].mask |= _BV(i + 1);
		} else {
			memmove(&tmp[j + 1], &tmp[j], sizeof(PwmValue) * (k - j));
			tmp[j].mask = _BV(i + 1);
			tmp[j].ocr = ocr;
			k++;
		}
	}
	for (i = 0; i < k; i++) {
		tmp[i].mask = ~tmp[i].mask;
	}
	tmp[k].mask = 0xFF;
	tmp[k].ocr = 100;
	cli();
	memmove(&pwm_values_sorted, &tmp, sizeof(tmp));
	sei();
}
А ещё интересно где бы почитать про реализацию I2C slave на attiny2313 (там для этого используется так называемый USI).
Реклама
Эиком - электронные компоненты и радиодетали
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите выбрать контроллер

Сообщение Alexeyslav »

Я бы использовал мелкий контроллер и управляемый по I2C специализированный 8-канальный ШИМ-контроллер для светодиодов.

Программный ШИМ плох тем что занимает слишком много ресурсов контроллера и трудно достичь приемлемую частоту ШИМ с высокой битностью, приходится сильно повышать тактовую частоту контроллера.
Реклама
Ответить

Вернуться в «Разные вопросы по МК»