satotsuのいろいろつくってみた日記

いろいろつくってみたあれこれの記録。

arduinoで相補PWMだしてみる。

arduinoでも相補PWM出せるよね。ということで試してみた。

 

これが一応最終形。オシロが1chしかないので、PWMの出力2つをつまんでる。

deadtimeと相補PWMでてるっぽい。1kHz。

f:id:msatotsu:20171229204739j:image

 

でも信号の切り替わりを拡大してみると、変なレベルがでてる。-2.5Vくらいのやつ。なんだこれ。

f:id:msatotsu:20171229205034j:image 

 

こいつのせいで、10kHzでdeadtimeを0にしても変な段つき波形になる。。

f:id:msatotsu:20171229205133j:image

 

一応ソースのせとく。timer1を使ってる。

 

#include <avr/io.h>
#include <avr/interrupt.h>

void PWM_init(uint8_t ch, uint8_t N, uint16_t top) {
// 0:in, 1:out, DDRB,DDRD: DIO, DDRC: AnalogIn
// timer0->PD6,5, timer1->PB1,2, timer2->PB3,PD3
DDRB = DDRB | B00000110;


// COM1x1,COM1x0: duty, 10: OCR1/TOP, 11:1-(OCR1/TOP)
TCCR1A = TCCR1A & ~(bit(COM1A1)|bit(COM1A0)|bit(COM1B1)|bit(COM1B0));
TCCR1A = TCCR1A |bit(COM1A1)|bit(COM1B1)|bit(COM1B0);
TCCR1B = (TCCR1B & B11100000) | bit(WGM13) | N;

TCNT1 = 0;
TIMSK1 = bit(TOIE1);
ICR1 = top;
OCR1A = 2000; // deadtime 0.5us -> 0.5us/50us*800=8
OCR1B = OCR1A - 1000;
}

void setup() {
noInterrupts();

TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;

PWM_init(1, 1, 8000);

interrupts();
}

ISR (TIMER1_OVF_vect) {
} void loop() { // put your main code here, to run repeatedly: }