PIN_PA5 に 10KHz の PWM出力をします。
プログラム
pwm01/pwm01.ino
// ----------------------------------------------------------------
/*
pwm01.ino
Sep/21/2025
*/
// ----------------------------------------------------------------
#define PROGRAM "pwm01.ino"
#define VERSION "2025-09-21 PM 12:17"
// ----------------------------------------------------------------
#define PWM_PIN PIN_PA5
int icount = 0;
// ----------------------------------------------------------------
void setup() {
Serial1.begin(19200);
delay(1000);
Serial1.println("*** setup start ***");
delay(1000);
Serial1.println("*** ATtiny3224 ***");
Serial1.println(PROGRAM);
delay(1000);
Serial1.println(VERSION);
delay(1000);
Serial1.print("CPU Clock = ");
Serial1.print(F_CPU);
Serial1.println(" Hz");
delay(1000);
// PWM ピンを出力に設定
pinMode(PWM_PIN, OUTPUT);
uint32_t cmp0 = 8332;
Serial1.println("cmp0 = " + String(cmp0));
TCA0.SINGLE.CMP0 = cmp0;
// タイマーの設定
TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP0EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc; // PWMモードを設定
TCA0.SINGLE.CTRLA = TCA_SINGLE_ENABLE_bm | TCA_SINGLE_CLKSEL_DIV8_gc;
// クロックを8で分周
}
// ----------------------------------------------------------------
void loop() {
int duties[] = {32,64,128};
for (int it=0; it< 3; it++)
{
Serial1.print("*** icount = " + String(icount));
Serial1.println("\tduty = " + String(duties[it]));
analogWrite(PWM_PIN, duties[it]);
delay(1000);
analogWrite(PWM_PIN, 0);
delay(1000);
}
icount++;
}
// ----------------------------------------------------------------
シリアルの出力
*** setup start ***
*** ATtiny3224 ***
pwm01.ino
2025-09-21 PM 12:17
CPU Clock = 20000000 Hz
cmp0 = 8332
*** icount = 0 duty = 32
*** icount = 0 duty = 64
*** icount = 0 duty = 128
*** icount = 1 duty = 32
*** icount = 1 duty = 64
*** icount = 1 duty = 128
分周比を変えて、周波数を変える方法
text/pwm01/pwm01.ino
// ----------------------------------------------------------------
/*
pwm01.ino
Sep/29/2025
*/
// ----------------------------------------------------------------
#define PROGRAM "pwm01.ino"
#define VERSION "2025-09-29 PM 19:44"
// ----------------------------------------------------------------
#define PWM_PIN PIN_PA5
// ----------------------------------------------------------------
void setup() {
Serial1.begin(19200);
delay(500);
Serial1.println("*** setup start ***");
Serial1.println("*** ATtiny3224 ***");
Serial1.println(PROGRAM);
Serial1.println(VERSION);
Serial1.print("CPU Clock = ");
Serial1.print(F_CPU);
Serial1.println(" Hz");
delay(500);
// PWM ピンを出力に設定
pinMode(PWM_PIN, OUTPUT);
uint32_t cmp0 = 8332;
Serial1.println("cmp0 = " + String(cmp0));
TCA0.SINGLE.CMP0 = cmp0;
// タイマーの設定
TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP0EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
// PWMモードを設定
TCA0.SINGLE.CTRLA = TCA_SINGLE_ENABLE_bm | TCA_SINGLE_CLKSEL_DIV1024_gc;
}
// ----------------------------------------------------------------
void loop() {
led_proc(TCA_SINGLE_CLKSEL_DIV4_gc);
led_proc(TCA_SINGLE_CLKSEL_DIV8_gc);
led_proc(TCA_SINGLE_CLKSEL_DIV16_gc);
led_proc(TCA_SINGLE_CLKSEL_DIV64_gc);
led_proc(TCA_SINGLE_CLKSEL_DIV256_gc);
led_proc(TCA_SINGLE_CLKSEL_DIV1024_gc);
delay(1000);
}
// ----------------------------------------------------------------
void led_proc(int div)
{
Serial1.println(String(div));
TCA0.SINGLE.CTRLA = TCA_SINGLE_ENABLE_bm | div;
int duty = 128;
analogWrite(PWM_PIN, duty);
delay(1000);
analogWrite(PWM_PIN, 0);
delay(1000);
}
// ----------------------------------------------------------------