Здравствуйте, уважаемые!
Решил попробовать написать программку для плавного изменения яркости светодиода. Я так понимаю, это делается при помощи ШИМ. Вот только я этого никогда не делал. Растолкуйте кто-нибудь на пальцах, как организовать ШИМ, пожалуйста или пните, где это очень подробно описано. МК - тини 2313, язык - СИ или Баском.
Схема, думаю, будет такая:
; любой PIC 12,16
; переменные:
j var byte
led var PortB.0 ; вывод управления светодиодом
; константы:
slow con 16 ; определяет скорость изменения
; вот и програмка:
output led ; вывод определяется как выход
while 1 ; безконечный цикл
led = ~led ; переключение в противоположное состояние
pauseus (127 + sin j) * slow ; пауза в микросекундах
led = ~led ; переключение в противоположное состояние
pauseus (127 - sin j) * slow ; пауза в микросекундах
j = j + 1
wend
1. настраиваете таймер1 вашей тини2313 на работу в режиме Fast PWM
2. настраиваете выход аппаратного ШИМ - по умолчанию он отключен.
3. запускаете таймер.
3. в регистр OCR1A записываете значение скважности 0...255 - на выходе аппаратного ШИМ формируется заданный сигнал.
вот и все
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):1. настраиваете таймер1 вашей тини2313 на работу в режиме Fast PWM
2. настраиваете выход аппаратного ШИМ - по умолчанию он отключен.
3. запускаете таймер.
3. в регистр OCR1A записываете значение скважности 0...255 - на выходе аппаратного ШИМ формируется заданный сигнал.
вот и все
Уважаемый!
позволю себе заметить, OCR1A - 16битный
Ну тогда так:
...
...
...
OCR1AH = 0x00;
OCR1AL = 0x64;
...
...
...
Правильно? Получается, что скважность можно регулировать от 0 до 65535? Не многовато ли?
Проекты с ШИМом я делал на Bascom'е по материалам вот этой статьи, там очень всё хорошо и доступно показано (пользуясь случаем, автору респект!).
Я использовал МК Mega8515/8535 и Tiny13, с 2313 пока дела не имел, но не думаю, что там будут проблемы.
Даже остановленные часы два раза в сутки показывают правильное время.
ARV писал(а):и шо с того? в него нельзя записать значение?!
записать-то можно, но это будет только 1/256 от макс. значения
это будет в строгом соответствии с указанным мною режимом Fast PWM ровно 100% заполнение. Если использовать иные режимы ШИМ, то можно писать и все 16 бит, но тогда частота ШИМ будет в 256 раз ниже
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Правильно так как надо в конкретной ситуации, и определяется настройками WGM13:WGM10. Хоть 2х разрядный (правда сам таким ни когда не пользовался) подробности в ДШ.
#include <tiny2313>
#include <delay>
void init(void)
{
// Инициализация порта А ; Порт А на Выход
DDRA=0xFF;
PORTA=0x00;
// Инициализация порта B ; Порт В на выход
DDRB=0xFF;
PORTB=0x01;
// Инициализация порта D ; Порт D на вход ; Подтяжка включена
DDRD=0x00;
PORTD=0xFF;
TIMSK=0b10000000;
TCCR1A=0b10000011;
TCCR1B=0x05;
OCR1AH = 0x00;
OCR1AL = 0x0F;
// #asm ("sei");
}
void main(void)
{
init();
while (1)
{
};
}
светодиод мигает с частотой примерно 2Гц
Вычитал что частота ШИМ считается по формуле F=Ft_c1/(N*256)
Есть еще варианты как просчитать параметры ШИМ?
И как определить в каком режиме работает? Быстрый шим или с коррекцией фазы...
Что бы менять яркость, мне нужно менять либо частоту импульсов или длительность... я правильно понял? Как длительность просчитать?
изменяя OCR1AL что то ничего не меняется