#include #include //LiquidCrystal(rs, enable, d4, d5, d6, d7); LiquidCrystal lcd(18, 19, 20, 21, 22, 23); ///18=24....23=29pin #define PWMB 12 //13pin(OC1B)に接続 #define PWMA 13 //19pin(OC1A)に接続 #define ADCYCLE A0 // A0=40pin #define ADDUTY A1 // A1=39pin #define RANGE 15 // 21pin unsigned long sclk = 20000000; //システムクロック20MHz unsigned long frq = 30000; // 周波数 30khz unsigned int duty = 50; // 指定したいデューティ比 50% char str[17]; String txt; unsigned int range; unsigned long ocra; unsigned long ocrb; void setup() { // put your setup code here, to run once: // noInterrupts(); //割り込み禁止 Serial.begin(115200); // pinMode(PWMA, OUTPUT); // pinMode(PWMB, OUTPUT); pinMode(RANGE, INPUT); digitalWrite(RANGE, HIGH); // プルアップ抵抗を有効に lcd.begin(16,2); lcd.clear(); lcd.setCursor(0, 0); /////////PWM タイマ1を使う ///// //電力削減レジスタ0 PRR0 = 0; //制御レジスタA TCCR1A = 0b10110011; //10:コンペアマッチAでLOW BでHIGH,11:高速PWM動作=OCR1A //制御レジスタB TCCR1B = 0b00011001; //11:高速PWM動作, 001:分周なし //タイマースタート // TOP値指定:WGM1111=OCR1A WGM1110=ICR1高速PWM動作 // TCCR1C = 0b00000000; // 最大値 OCR1A = sclk/(frq-1); // サイクル周波数指定 20MHz=50ns max *65536=305Hz *64=312KHz 1MHz=0.000001s // 100khz=10000ns 10000ns/50ns-1=199 // 比較値 // Duty比指定 HIGHの時間(クロック数) max 0xFFFF OCR1B = ((sclk/(frq-1))*duty)/100; DDRD = 0b00110000; ///PD5 PD4 //PORTD = 0b10000000; //PD7のプルアップ抵抗を有効 // interrupts(); //割り込許可 } void loop() { if (digitalRead(RANGE) == LOW){range = 100;}else{range = 500;} frq = analogRead(ADCYCLE); duty = analogRead(ADDUTY); /////10bitAD frq = (frq+1)*range; if(frq > 500000)frq=500000; if(frq < 500)frq=500; duty = duty/10; if(duty > 100)duty=100; Serial.printf("周波数=%6luHz", frq); Serial.printf(" Duty=%3d%%\n", duty); sprintf(str, "Cycle= %6luHz ", frq); txt = str; lcd.setCursor(0, 0); lcd.print(txt); sprintf(str, "Duty=%3d%% R=%3d", duty, range); txt = str; lcd.setCursor(0, 1); lcd.print(txt); ocra = sclk/(frq-1); ocrb = ((sclk/(frq-1))*duty)/100; OCR1A = ocra; OCR1B = ocrb; Serial.printf("OCR1A = %6ld OCR1B = %6ld\n", ocra, ocrb); delay(1000); }