static void delay(unsigned char d){
// задержка в d микросекунд
for(; d; d--) delay_us(1);
}
int main(void){
unsigned char PWM; // коэффициент заполнения ШИМ (от 1 до 254)
unsigned int counter;
DDRD = 1; // ШИМить будем на 0 бите порта D
while(1)
for(PWM = 1; PWM < 255; PWM++){
for(counter = 0; counter < 1000; counter++){
PORTD |= 1;
delay(255-PWM);
PORTD &= ~1;
delay(PWM);
}
}
}
светодиод на указанном порту должен плавно разгораться, потом на максимуме яркости тухнуть мгновенно и снова разгораться. разгорание должно занять чуть больше минуты, т.е. оно очень плавное
надеюсь, чем регулировать скорость разгорания - разберетесь?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Вопрос:нужно 4 канала програмного ШИМ.Частота ШИМ 25-30 кГц.Контроллер Атмега32(8мГц).Я так понял можна на одном таймере сделать?Можно пример кода если можно или пример настройки таймера?Подскажите если не трудно.
Я читал там.Но все равно не совсем понял как реализовать програмный ШИМ.Буду безмерно благодарен если кто нибудь выложит пример кода на С(а если для Код Вижн вообще супер),заранее спасибо.
заводиш таймер на прерывание по переполнению и на сравнение, в регистр для сравнения записуеш число оно и будет определять скважность по прерыванию сравнения обнуляеш какой либо пин а по переполнению выставляеш в 1 , вот и все.
Русский человек читает инструкцию тогда, когда точно понял, что поломал.
andrey_artemov,можно настройку таймера для Вашего кода?Сама идея програмного Шима мне понятна,но что то больше чем 122 Гц у меня частота не получается.А у Вас 8 каналов на какой частоте работают?
в последнем приведенном примере есть одно слабое место: фазы импульсов по каналам будут плавать друг относительно друга. ненамного, конечно, но будут. если такой джиттер не желателен, то лучше завести локальную переменную в обработчике прерываний, ставить в ней биты в зависимости от состояния каналов, а потом сразу эту переменную выводить в порт - тогда ВСЕ каналы будут менять свои уровни синхронно
частота ШИМ определяется по формуле (приблизительно): Fpwm = Ftovf / (Dmax+1), где Ftovf - частота прерываний таймера, а Dmax - максимальное значение счетчика для канала ШИМ. Пример: 8-битный таймер тактируется от 8 МГц без предделителя, прерывание по переполнению, Dmax=255 (1 байт), значит: Ftovf = 8000000 / 256 = 31250 Гц Fpwm = 31250 / 256 = 122 Гц
От числа каналов частота ШИМ практически не зависит, но следует учесть, что сам по себе обработчик прерываний отнимает некоторое количество тактов, поэтому просто сокращая Dmax (т.е. уменьшая число градаций ШИМ) все равно нельзя добиться частоты выше некоторого пределного значения, которое зависит от того, насколько оптимальный код обработчика прерывания генерирует компилятор.
не забывайте, что можно "подстроить" частоту встроенного RC-генератора МК и добиться почти удвоения его рабочей частоты - это варинт поднять частоту ШИМ без снижения Dmax
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
andrey_artemov, это решение "в лоб", отнимающее уйму процессорного времени. Всякого рода световые табло строятся на другом принципе - массив, предназначенный для вывода, разворачивается на 90 градусов. Градацию в 256 уровней получают по всего 8 срабатываниям таймера - 1 срабатывание получают, анализируя старшие разрябы массива и выводят в порт. Второе срабатывание будет через половину периода шим, выводятся разряды массива д6, затем через 3/4 периода - д5 и так далее.
Попробуйте , Вам понравится.
Вот мой вариант с пиком, читать, начиная со слов у меня "текст немножечко по дебильному написан" (С) Добкин. http://www.remexpert.com/ipb/topic3875s20.html?start=20
Полный текст проги - я делал вращение входного массива во время между выдачей д6 и д5, а время между д7 и д6 отдавал другим задачам, если интересно, поищу.
Уважаемый ARV, просто у меня совпало, что всё выводится в один порт С, но до этого выводились в разные порты - по 2 бита, и поэтому каждый бит пишется отдельно, конечно я согласен, что в данном случае нужно писать в порт сразу один байт соответственно одной командой записи....
urry очень красивое у Вас решение - попробую сделать как у Вас.
stolyars Процессор настроен на внутренний генератор 8 MHZ
Инициализация таймера