Нужен контроллер (AVR или PIC), который бы удовлетворял 3 требованиям:
1) Имел 4 16-битных ШИМ-канала
2) Имел аппаратный I2C с поддержкой режима Slave
3) Был в DIP-корпусе
Либо подойдёт просто ШИМ-контроллер с 4 каналами, I2C интерфейсом и DIP-корпусом.
Проблема выбора осложняется тем, что не хотелось бы заказывать детали, а купить в местном радиомагазине, а там выбор немного ограничен.
Что можете посоветовать (разумеется, для такого применения мне не нужен контроллер с сотней килобайт флеша - мне нужен вариант подешевле)?
Помогите выбрать контроллер
- Реклама
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: Помогите выбрать контроллер
Из распространенных AVR 2 16-битных таймера и 5 ШИМ каналов есть начиная с ATmega64. Но он в дип не бывает.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Помогите выбрать контроллер
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Помогите выбрать контроллер
В общем, решил использовать attiny2313, на которой реализовать программный ШИМ. Мне хватит и разрешения немного меньше 16 бит.
Вроде работает, но хотелось бы услышать ваше мнение, а то вдруг в коде есть какая-нибудь ошибка, которая проявится потом в самый неподходящий момент. Итак, всего у меня 4 канала ШИМ, подключенные к PB1, PB2, PB3 и PB4. Количество вариантов коэффициента заполнения - 4000, ибо в принципе для моей задачи хватит и такого. Тактуется МК от внешнего кварца на 16 МГц. Значения ШИМ хранятся в массиве pwm_values. После изменения вызывается функций pwm_update, которая переносит их в отсортированный массив для обработчика прерывания.
А ещё интересно где бы почитать про реализацию I2C slave на attiny2313 (там для этого используется так называемый USI).
Вроде работает, но хотелось бы услышать ваше мнение, а то вдруг в коде есть какая-нибудь ошибка, которая проявится потом в самый неподходящий момент. Итак, всего у меня 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();
}
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Помогите выбрать контроллер
Я бы использовал мелкий контроллер и управляемый по I2C специализированный 8-канальный ШИМ-контроллер для светодиодов.
Программный ШИМ плох тем что занимает слишком много ресурсов контроллера и трудно достичь приемлемую частоту ШИМ с высокой битностью, приходится сильно повышать тактовую частоту контроллера.
Программный ШИМ плох тем что занимает слишком много ресурсов контроллера и трудно достичь приемлемую частоту ШИМ с высокой битностью, приходится сильно повышать тактовую частоту контроллера.
- Реклама

