Без описания |
Поиск в теме | Версия для печати |
mihail |
Отправлено: 22 Сентября, 2010 - 18:40:53
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Достоинством приведенного ниже способа создания ШИМ (PWM) является то, что можно организовать ШИМ (PWM) практически на любой ножке микроконтроллера. А недостатком является то, что необходимо учитывать возможные конфликты прерываний.
CODE:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.8a Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 22.09.2010
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
/* прерывание при переполнении таймера/счетчика 0 */
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/* PB7=0, PB6=0, PB5=0, PB4=0, PB3=0, PB2=0, PB1=1, PB0=1 */
PORTB = 0b00000011;
/* PD7=0, PD6=0, PD5=0, PD4=0, PD3=0, PD2=0, PD1=0, PD0=0 */
PORTD = 0b00000000;
}
/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0A таймера/счетчика 0 */
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
/* PD7=0, PD6=1, PD5=1, PD4=1, PD3=1, PD2=1, PD1=1, PD0=1 */
PORTD = 0b01111111;
}
/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0В таймера/счетчика 0 */
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
/* PB7=0, PB6=0, PB5=0, PB4=0, PB3=1, PB2=1, PB1=0, PB0=0 */
PORTB = 0b00001100;
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
/* все выводы порта B сконфигурировать как выходы */
DDRB = 0b11111111;
PORTB = 0b00000000;
/* все выводы порта D сконфигурировать как выходы */
DDRD = 0b11111111;
PORTD = 0b00000000;
/* Timer/Counter 0 Control Register A */
/* регистр управления таймером/счетчиком 0 А */
/* биты регистра:
COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00 */
TCCR0A = 0b00000000;
/* Timer/Counter 0 Control Register B */
/* регистр управления таймером/счетчиком 0 В */
/* биты регистра:
FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00 */
TCCR0B = 0b00000011;
/* Timer/Counter 0 */
/* счётный регистр таймера/счетчика 0 */
TCNT0 = 0;
/* Output Compare Register А */
/* регистр сравнения таймера/счетчика 0 А */
OCR0A = 100;
/* Output Compare Register В */
/* регистр сравнения таймера/счетчика 0 В */
OCR0B = 200;
/* Timer/Counter Interrapt Mask Register */
/* регистр маски прерываний таймеров/счетчиков */
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK = 0b00000111;
/* глобальное разрешение прерываний */
#asm("sei")
while (1)
{
/* *******************************************
Изменяя значение регистров сравнения можно менять значение ШИМ (PWM)
Так как таймер/счетчик 0 является восьмиразрядным, то значения регистров сравнения должны быть от 0 (0b00000000 или 0x00) до 255 (0b11111111 или 0xFF)
******************************************* */
OCR0A = 128;
/* *******************************************
ШИМ (PWM) на всех ножках порта D составляет около 50%
******************************************* */
OCR0B = 64;
/* *******************************************
ШИМ (PWM) на PB1 и PB0 составляет около 25%
ШИМ (PWM) на PB3 и PB2 составляет около 75%
******************************************* */
}
}
В этой программе для Вас не должно быть ничего нового. Простой ШИМ (PWM) организован на ножках порта D. Более интересен вариант на ножках порта B. Увеличение ШИМ (PWM) на PB1 и PB0 приводит к пропорциональному уменьшению ШИМ (PWM) на PB3 и PB2. И наоборот. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (17): В начало « ... 4 5 6 7 [8] 9 10 11 12 ... » В конец |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|