serhat atılgan
Üye
- Katılım
- 29 Kas 2008
- Mesajlar
- 22
- Puanları
- 1
- Yaş
- 40
Merhaba arkadaşlar analog bir sinyal üzerinden istediğim bölümünden 10 us luk bir kaç örnek almak istiyorum bunu arduinoda nasıl yapabilirim
Merhaba arkadaşlar analog bir sinyal üzerinden istediğim bölümünden 10 us luk bir kaç örnek almak istiyorum bunu arduinoda nasıl yapabilirim
On ATmega based boards (UNO, Nano, Mini, Mega), it takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second.
Sorumu soyle duzelteyim mesela bir bobine pulse gonderiyoruz pulse sinyalini kestigimizde bobin uzerinde zit emk olusuyor bu emk atiyorum 50 us ta sonumleniyor yani 0v a geliyor ben bu sonumlenmenin 40.us taki voltaji okumak istiyorum mesela bir volt adc karsiligi atiyorum200 se ben bunu anlik olarak okumak istiyorumAlamazsın. Atmega işlemcisinin minimum çevirme hızı 100us dir. 10us lik bir örnekleme yapamaz.
https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
Anladim tesekkur ederim peki adc yi bir kere okumak icin hangi komutu kullaniyoruz analogRead komutuyla giriste degisken sinyali surekli okuyorum tek seferlik okumak istiyorum yani bi kere okuyup onu bi degiskene kaydetmek istiyorum sonra o degeri baska bi degerle karsilastiricamAtmega çiplerde okuma işlemini motor durduğu anda başlatsan bile 100mikrosaniye sonra cevap alırsın. 40us bulmak zor. Stm32 kullanırsan şansın artacaktır. 1us örnekleme hızı var sanırım. Harici kesmeyle motorun durduğu anı farkedip 39us sayıp örneklemeye başlaması gerekir. Lakin hiçbir çip sana birebir 40us değerini vermez. Osiloskopla kalibre etmelisin.
Sürekli okumanın sebebi loop içerisinde kullanman, aşağıdaki gibi harici kesmeye bağlaman gerekiyor ki sadece motor durduğunda okusun.Anladim tesekkur ederim peki adc yi bir kere okumak icin hangi komutu kullaniyoruz analogRead komutuyla giriste degisken sinyali surekli okuyorum tek seferlik okumak istiyorum yani bi kere okuyup onu bi degiskene kaydetmek istiyorum sonra o degeri baska bi degerle karsilastiricam
const uint8_t motorPin = 2;
const uint8_t adcPin = A0;
volatile uint16_t adc_degeri;
void setup() {
pinMode(interruptPin,INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin),kesmeFonk,FALLING);
}
void loop() {
}
void kesmeFonk() {
adc_degeri = analogRead(adcPin);
}
Cok tesekkurler yardimin icinSürekli okumanın sebebi loop içerisinde kullanman, aşağıdaki gibi harici kesmeye bağlaman gerekiyor ki sadece motor durduğunda okusun.
C++:const uint8_t motorPin = 2; const uint8_t adcPin = A0; volatile uint16_t adc_degeri; void setup() { pinMode(interruptPin,INPUT); attachInterrupt(digitalPinToInterrupt(interruptPin),kesmeFonk,FALLING); } void loop() { } void kesmeFonk() { adc_degeri = analogRead(adcPin); }
ADC pininin onune sample/hold ya da trace/hold devresi koyarsin.
Bobini enerjilersin. Enerjisini kesersin ve 40 uS sonra hold sinyali uretirsin. Bu esnada bobindeki emknin degeri analog olarak saklanmis olur. Daha sonra da bu degeri ADC ile olcersin.
Fakat zamanlamasi kritik islemler icin gerekirse low level kodlama yapman gerekir.
Altin arayacaksin galiba
Altin aramaktan ziyade isin hobi elektronik kismindayim daha once analog devreler yaptim smdi mikro islemcili olarak kendm bisiler yapmaya calisiyorum ogrenme ve keyif amacli diyebilirizADC pininin onune sample/hold ya da trace/hold devresi koyarsin.
Bobini enerjilersin. Enerjisini kesersin ve 40 uS sonra hold sinyali uretirsin. Bu esnada bobindeki emknin degeri analog olarak saklanmis olur. Daha sonra da bu degeri ADC ile olcersin.
Fakat zamanlamasi kritik islemler icin gerekirse low level kodlama yapman gerekir.
Altin arayacaksin galiba.