LGT8F328P настройка ШИМ на PD2/INT0/OC3B

MartynovElectric
Offline
Зарегистрирован: 08.06.2022

Здравствуйте!

Не могу понять почему ШИМ не запускается.

#include <EEPROM.h>
#include <GRGB.h>

#define B_Kanal D5
#define R_Kanal D2 //D2 F2
#define G_Kanal D6

GRGB led(COMMON_CATHODE, R_Kanal, G_Kanal, B_Kanal);

void setup()
{
  HDR |= 1 << 0;  // Enable high current D5
  HDR |= 1 << 1;  // Enable high current D6
  //HDR |= 1 << 3;  // Enable high current F2/D2

  pinMode(R_Kanal, OUTPUT);
  pinMode(G_Kanal, OUTPUT);
  pinMode(B_Kanal, OUTPUT);
  digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, LOW);
  
  digitalWrite(R_Kanal, HIGH);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, LOW);
  delay(1000);
  digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, HIGH);
  digitalWrite(B_Kanal, LOW);
  delay(1000);
  digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, HIGH);
  delay(1000);
  digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, LOW);
}

void SHIMWrite(byte val)
{
  TCCR3A |= (1 << COM3A1);
  TCCR3A |= (1 << COM3B1);
  TCCR3A |= (1 << WGM30);
  TCCR3B |= (1 << WGM32);
  TCCR3B |= (1 << CS30);
  OCR3BH = 0;
  OCR3BL = val;
}

void loop()
{
  SHIMWrite(100);
  delay(1000);
}

Такое чувство, что что-то я не активировал… связь между таймером и тактовым генератором или питание таймера или ещё чего. https://disk.yandex.ru/i/F-669sUXm0UfMQ

Раньше для PIC писал, там примеры прям в документации, для STM есть программа конфигуратор периферии, а тут не знаю даже куда копать.

renoshnik
Offline
Зарегистрирован: 11.04.2013
MartynovElectric
Offline
Зарегистрирован: 08.06.2022

Немного разобрался, "GRGB led" мешал.

Но таймер так и не удалось перевести в режим PWM. Только CTC работает.

#include <EEPROM.h>

#define B_Kanal D5
#define R_Kanal D2 //D2 F2
#define G_Kanal D6

enum Prescalers {
   PRESCALER_STOP = 0,
   PRESCALER_1 = 1, 
   PRESCALER_8 = 2,
   PRESCALER_64 = 3,
   PRESCALER_256 = 4, 
   PRESCALER_1024 = 5
};

int dig = 256;
uint8_t r3ah; 
uint8_t r3al;

void setup()
{
  HDR |= 1 << 0;  // Enable high current D5
  HDR |= 1 << 1;  // Enable high current D6
  //HDR |= 1 << 3;  // Enable high current F2/D2

  //pinMode(R_Kanal, OUTPUT);
  pinMode(G_Kanal, OUTPUT);
  pinMode(B_Kanal, OUTPUT);
  //digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, LOW);
  
  //digitalWrite(R_Kanal, HIGH);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, LOW);
  delay(1000);
  //digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, HIGH);
  digitalWrite(B_Kanal, LOW);
  delay(1000);
  //digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, HIGH);
  delay(1000);
  //digitalWrite(R_Kanal, LOW);
  digitalWrite(G_Kanal, LOW);
  digitalWrite(B_Kanal, LOW);
}

void SHIMWrite(byte val)
{
  DDRF |= (1<<PF2) | (1<<PF1);
  OCR3AH = 0x00;          // Важно, вначале необходимо загрузить верхний регистр!!!
  OCR3AL = val;          // затем нижний, Нельзя как для Atmega328 -  OCR3A = topValue;
  OCR3BH = 0x00;
  OCR3BL = val;
  TCCR3A |= (1 <<COM3A0) | (1 << COM3B0) | (1 << WGM31) | (1 << WGM30);  
  
  TCCR3B = (1 << WGM33) | (1 << WGM32) | 5;  
  
  //TCCR3A=1 <<COM3A0 | 1<<COM3B0;  // ПИН D2 + TXI
  //TCCR3B = (1 << WGM32) | 5;   // Режим СТС WGM3[3:0]=4 или 12
}

void loop()
{
  SHIMWrite(100);
  delay(1000);
}

D2 не реагирует никак, а вот на TX есть сигнал, частота которого зависит от val, но ШИМ - скважность надо менять, а не частоту. В общем пока не получается.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

15.2.3. Быстрый режим PWM

Когда установлено WGM3[3:0] = 5,6,7,14 или 15, счетчик/таймер 3 переходит
в быстрый режим ШИМ, то счетом максимального значения TOP являются 0xFF, 0x1FF, 0x3FF, ICR3 или OCR3A, он может быть использован для получения Высокочастотный ШИМ-сигнал. Разница между быстрым режимом PWM и другими режимами PWM заключается в том, что это односторонняя операция.

MartynovElectric
Offline
Зарегистрирован: 08.06.2022

Разобрались!

void SHIMWrite(byte val)
{
  DDRF |= (1<<PF2) | (1<<PF1);
  
  OCR3AH = 0x00;
  OCR3AL = val;
  OCR3BH = 0x00;
  OCR3BL = val;
  ICR3H = 0x00;
  ICR3L = 0xFF;

  TCCR3A = 0xA0;
  TCCR3B = 0x12;
}

void loop()
{
  SHIMWrite(255);
  delay(10000);
  SHIMWrite(254);
  delay(10000);
  SHIMWrite(4);
  delay(10000);
  SHIMWrite(0);
  delay(10000);
}

 

kpmic
Offline
Зарегистрирован: 01.12.2019

Кто подскажет как LGT8F328 с кварцем на 16 мГц перевести в режим работы на 32 мГц.