MadDoc

Аппаратный ШИМ на Attiny13 и Proteus

6 сообщений в этой теме

MadDoc    1

Начинаю осваивать микроконтроллеры, так что сильно не бейте...

Не запускается симуляция ШИМ в Proteus

Код:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

int main()
 {
   DDRB=(0<<DDB4)|(1<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1<<DDB0);
   PORTB=(0<<PB4)|(0<<PB3)|(0<<PB2)|(0<<PB1)|(0<<PB0);
   TCCR0A = (1 << COM0A1)|(0 << COM0A0)|(1 << WGM01)|(1 << WGM00);
   TCCR0B = (1 << WGM02)|(0 << CS02)|(1 << CS01)|(1 << CS00);
   TIMSK0 = 0x00;
   TCNT0 = 0x00;
   OCR0A = 0x5F;
   while (1) {
      //OCR0A++;
      //_delay_ms(100);
   }
      ;
   return 0;
 }

Схема:

599ad14c7cad5_.thumb.jpg.958fd10082f4015c140e83184d90c850.jpg

Компилятор - WinAVR; Proteus 8.6 SP 2

Проект в Proteus  прилагается.

При переключении COM0A1 COM0A0 в режим "Toggle OC0A on Compare Match" - работает как генератор прямоугольных импульсов с изменяемой частотой, в зависимости от OCR0A.

Подскажите, что не так, а то уже и по колесам стучал и лобовое стекло протирал...:(

TEST.pdsprj

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Alexeyslav    575

Так так и должно быть, в этом режиме ты генерируешь меандр т.к. состояние вывода OC0A будет меняться на противоположное при достижении условия совпадения в регистре сравнения. Этот режим предназначен для меандра переменной частоты(пищалки и т.д.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MadDoc    1

Возможно я не совсем корректно сформулировал вопрос:

В режимах "Phase Correct PWM Mode" (WGM02:0 = 5) и "Fast PWM Mode" (WGM02:0 = 7) при установке (COM0A1:0 = 2 или 3 - "Clear OC0A on Compare Match, set OC0A at TOP" и "Set OC0A on Compare Match, clear OC0A at TOP")  ничего не происходит. Вывод ШИМ OCA устанавливается или сбрасывается один раз в зависимости от начальной установки порта и больше ничего не происходит. Счетчик считает от 0 до OCR0A и сбрасывается хотя по даташиту должно быть так:

Скрытый текст

Phase Correct PWM Mode

The phase correct PWM mode (WGM02:0 = 1 or 5) provides a high resolution phase correct PWM waveform generation option. The phase correct PWM mode is based on a dual-slope operation. The counter counts repeatedly from BOTTOM to TOP and then from TOP to BOTTOM. TOP is defined as 0xFF when WGM2:0 = 1, and OCR0A when WGM2:0 = 5. In non-inverting Compare Output mode, the Output Compare (OC0x) is cleared on the Compare Match between TCNT0 and OCR0x while upcounting, and set on the Compare Match while down- counting. In inverting Output Compare mode, the operation is inverted.

Fast PWM Mode

The counter counts from BOTTOM to TOP then restarts from BOTTOM. TOP is defined as 0xFF when WGM2:0 = 3, and OCR0A when WGM2:0 = 7. In non-inverting Compare Output mode, the Output Compare (OC0x) is cleared on the Compare Match between TCNT0 and OCR0x, and set at BOTTOM. In inverting Compare Output mode, the out-put is set on Compare Match and cleared at BOTTOM.

В AVR Studio поведение программы аналогичное Proteus.

При программировании ШИМ в Bascom-AVR - ШИМ в Proteus ведет себя корректно.

Подскажите, почему так: это глюк Proteus  или я не учитываю что-то в регистрах?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    247
В 8/22/2017 в 10:33, MadDoc сказал:

Счетчик считает от 0 до OCR0A

потому что у Вас все три бита WGM установлены в 1, т.е. WGM2:0 = 7

Надо бит WGM02 установить в 0. Если сделать так

TCCR0B = (0 << WGM02)|(0 << CS02)|(1 << CS01)|(1 << CS00)

то счётчик будет считать до 0xFF, и всё заработает как надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MadDoc    1

Спасибо откликнувшимся. Тему можно закрывать.

Сам тоже доехал... Не правильно истолковал даташит.

При WGM02=0

Phase Correct PWM Mode: счетчик считает от 0 до FF и от FF до 0 при совпадении значения с OCR0A происходит переключение вывода OCA.

Fast PWM Mode: счетчик считает от 0 до FF и сбрасывается в 0 при совпадении значения с OCR0A и при сбросе происходит переключение вывода OCA.

При WGM02=1

Phase Correct PWM Mode и режим "Toggle OC0A on Compare Match": счетчик считает от 0 до OCR0A и от OCR0A до 0 при совпадении значения с OCR0A происходит переключение вывода OCA.

Fast PWM Modeи и режим "Toggle OC0A on Compare Match": счетчик считает от 0 до OCR0A и сбрасывается в 0 при совпадении значения с OCR0A происходит переключение вывода OCA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...