semih_s
Hobici
- Katılım
- 16 Aralık 2020
- Mesajlar
- 1,969
Bu koda bir de analog değer eklemek istiyorum ama nasıl ya da ne yapmam gerektiğini bilmiyorum. Aslında PWM çıkışı verdiğim portun birine bir kondansatör ile sinüs çıktı alabilirim sanırım. Bu noktada tavsiye iyi olur.
Tavsiye olmadı bu pek. muhtemelen işinize de bu haliyle yaramaz, yalnız tamamen interruptlarla çalışıyor ve loop size kalıyor.
Kod:
byte adim=0;
char yon=1;
byte genlik[128];
float buffer_f;
ISR(TIMER2_COMPA_vect)
{
// sinüs dalga için
OCR1B=genlik[adim];
adim++;
if(adim>118)adim=0; // serinin başına döner
/*
// üçgen dalga için
OCR0B=adim+1;
adim+=yon;
if(adim==100)yon=-1;
if(adim==0)yon=1;
*/
}
void setup() {
// 360 dereceyi 3 dercelik adımlarla örnekleyerek sinüsü simüle etmeye çalışacağım.
// sin0 ila sin357 değerleri lazım sonra seri yeni baştan. 119 değer yapıyor.
for(byte i=0;i<119;i++)
{
buffer_f= i*3; // hesaplanacak açı
buffer_f=buffer_f * M_PI / 180; //açı radyana çevrilir
// i açısının sinüsünü 0-100 arasında yayar. ofseti 2,5V olan bir sinüs bekliyorum.
genlik[i]=sin(buffer_f)*50+50;
}
//Timer 0 ile pwm ve analog sinyal üretimi
pinMode(10,OUTPUT);
pinMode(6,OUTPUT);
//Arduino defaultlarını iptal eder
TCCR1B=0;
TCCR1A=0;
TIMSK1=0;
TCCR1A|= 1<<COM1B1 | 1<<WGM11 | 1<<WGM10; // keyfi PWM periyodu(OCR0Aile ayarlanır)PWM çıkışı OC0B
TCCR1B|= 1<<WGM12 | 1<<WGM13;
OCR1A=100; // PWM çözünürlüğü 100;
OCR1B=50; // Başlangı. için %50 duty
TCCR1B|=0b1; // PRSCL=1;
delay(5000);
// timer2 ile dalga formu üretimi
//arduino defaultlarını 0'la
TCCR2A=0;
TCCR2B=0;
TIMSK2=0;
TCCR2A|=1<<WGM21; // CTC modda OCR2A üst değer, sinyal frekansını bu belirleyecek
TIMSK2|= 1<<OCIE2A; // sayacın OCR2A ile eşleşmesinde interrupt üretir.
TCCR2B|=0b101;
OCR2A=100; // dalga formunun frekansını belirler, ters orantılı 1 ila 255
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
Bu kod arduino uno D10 pininden 10kOhm ve 220nf lowpass filtre ile sinüs üretiyor.
timer1 ile pwm üretip timer2 ile duty cycle tayin ediyor. OCR2A ile frekans değiştirilebiliyor.
exelde baya bir sinüse benziyordu. sonra kodladım.
üstteki sarı sinyal pwm ile sinüsü ürettim. Bunun kusursuz bir sinüs dalgadan ne kadar farklı olduğunu nasıl ölçerim?
Yalnız böyle sinüs üretmek pek iyi değil, frekansı arttırdıkça genlik düşüyor. yalnız gerekli frekansa göre kod ve devre düzenlenerek daha yüksek frekanslar elde edilebilir herhalde.
Bu iyi geldi, meşgale arıyordum .