ücreti mukabilinde proje yardımı

alemrans

Yeni Üye
Katılım
25 Aralık 2024
Mesajlar
6
Merhabalar. Mikroişlemciler dersi kapsamında Ocak 2 ye kadar bir proje sunmam gerekiyor. Kendim çok denedim ancak 1 haftada yetiştirmek için yeterli olduğumu düşünmüyorum. Aslında yapabilirm diye düşünmüştüm ancak beceremedim. Özetliyim: pic16f877a üzerinde tank benzeri bir proje yapmak istiyorum. açı değerleri servo motor ve potansiyometre aracılığıyla sağlanacak. Güvenlik önlemleri sebebiyle belirli açılarda atışa izin verilecek(örn45-135 derece arası). Atış selenoid motor ile gerçekleşecek.Ve gereksiz de olsa dersin içeriklerini kullanmam gerekecek(wdt,eeprom vs.) detaylı bilgi için lütfen iletişime geçin.
 
3 5 günde imkansız.
Birkaç servo motor (Step motor da olabilir) ve bir selenoid kullanacaksınızki sadece donanımsal olarak bile sonuçlandıramazsınız.
Yazılım ayrı bir safha.
Bredboard üstünde belki ancak.
Fakat o da uzaktan yapılacak birşey değil.
16F877 de kötü bir seçim.
 
3 5 günde imkansız.
Birkaç servo motor (Step motor da olabilir) ve bir selenoid kullanacaksınızki sadece donanımsal olarak bile sonuçlandıramazsınız.
Yazılım ayrı bir safha.
Bredboard üstünde belki ancak.
Fakat o da uzaktan yapılacak birşey değil.
16F877 de kötü bir seçim.
buradaki servo muhtemelen dronelardaki RC servodur. basit bir pwm sinyali ile kontrol ediliyor.
 
16f877a dunya genelinde akademik kaynaklarda cok geçtiği için mufredat onun uzerinde yürüyor
Benzer sekilde 8051 de cok kullanılır
 
Konum bilgisi içerebilen bir servo olması gerek.
aslında hayır. çok komplike bir şey gerekmmiyor. Tek rc ve açısını kontrol etmek istiyorum. Selenoidle de ateş butonuyla ateş ettiricem zaten. Servoyla selenoidi üst üste bağlarsam sorun çözülmüş olmaz mı? Konum bilgisinden kastınızı anlayamadım. 16f877 seçimi ise opsiyonel değil maalesef. bununla yapmak zorundayım.
 
aslında hayır. çok komplike bir şey gerekmmiyor. Tek rc ve açısını kontrol etmek istiyorum. Selenoidle de ateş butonuyla ateş ettiricem zaten. Servoyla selenoidi üst üste bağlarsam sorun çözülmüş olmaz mı? Konum bilgisinden kastınızı anlayamadım. 16f877 seçimi ise opsiyonel değil maalesef. bununla yapmak zorundayım.
Servo kendisi hangi açıda olduğunu senden öğrenir ve o açıda kalır elle açıyı değişrtirmeye zorlasanda gene olması gereken açıya gider.
Konumdan kasıt budur.
360 derecenin neresinde olduğunu kendisi bilecek senim konum komutunla karşılaştırıp çek ederek doğru konumlama yapacak.
Selenoidin nerede olduğu önemsiz.
2 adet servo ile yerden yukarıya namlu açısı ve sağa sola dönebilecek eksen açısı lazım sana.
Açılar tamamlandığında selenoid devreye sokulabilir.

Aynı şey uydu konumunu takip edecek hareketli mobil cihazlar için de kulşlanılır.
 
aslında hayır. çok komplike bir şey gerekmmiyor. Tek rc ve açısını kontrol etmek istiyorum. Selenoidle de ateş butonuyla ateş ettiricem zaten. Servoyla selenoidi üst üste bağlarsam sorun çözülmüş olmaz mı? Konum bilgisinden kastınızı anlayamadım. 16f877 seçimi ise opsiyonel değil maalesef. bununla yapmak zorundayım.
bu servolardan mı bahsediyorsun ?
bu RC servolar 1ms ile 2ms arası pwm sinyalini alır bu sinyaldeki pozitif pulse genişliğine göre açısı belirlenir kendi içinde basit resistif açı feedback kontrolü var. 16f877 ile bunlardan 2 tane kontrol edebilirsin.

1735241697972.png
 
bu servolardan mı bahsediyorsun ?
bu RC servolar 1ms ile 2ms arası pwm sinyalini alır bu sinyaldeki pozitif pulse genişliğine göre açısı belirlenir kendi içinde basit resistif açı feedback kontrolü var. 16f877 ile bunlardan 2 tane kontrol edebilirsin
yani sg90 tipiyse bu motor evet. temel bilgilere sahibim. 50hz küçük bir frekans olduğu için ccp pinlerinden istenilen pwmi üretemiyorum. çünkü osilatör periyodum 4Mhz. dolayısıyla pwm'i yazılımsal yapmak zorundayım. açıkçası 2 taneye de gerek yok 1 tane bana yeter namluyu sadece sağ sol yapmak istiyorum. temel başlıklar hakkında bilgi sahibiyim ancak iş yazılıma gelince tıkanıyorum. 6 günde ne çıkartabilirm bilmiyorum
 
yani sg90 tipiyse bu motor evet. temel bilgilere sahibim. 50hz küçük bir frekans olduğu için ccp pinlerinden istenilen pwmi üretemiyorum. çünkü osilatör periyodum 4Mhz. dolayısıyla pwm'i yazılımsal yapmak zorundayım. açıkçası 2 taneye de gerek yok 1 tane bana yeter namluyu sadece sağ sol yapmak istiyorum. temel başlıklar hakkında bilgi sahibiyim ancak iş yazılıma gelince tıkanıyorum. 6 günde ne çıkartabilirm bilmiyorum
saniyede 50 defa tetiklenecek bir timer kur buraya geldiğinde istediğin açıya denk gelecek zamanı hesapla ilgili pini H yap ve süre bitiminde pini low yapacak bir timer daha kur. ikinci timer int geldiğinde pini low yap ve bu timeri disable et.

SG90 vs fark etmiyor onlar marka model - bütün RC servolar aynıdır 6 volt besleme ver ve kontrol pininden 50hz 1ms genişlikli pwm uygula.
ödevi komple bitirmen gerekmiyor, yapabildiğin noktaya kadar getir ve sunumunu yap. hiç yapamamaktan çok daha iyidir.

16f877 işlemciyi 4mhz çalıştırmak zorunda değilsin. daha düşük 1mhz gibi frekanslarda da çalıştırabilirsin.

ilk adımda ccs veya mplab derleyici ile basit bir led on off kodu yaz. bunu devrede ya da proteusta çalıştır. hatta proteusta hazır bir sürü kurulu servo devre vardır bunların üzerinde oynayabilirsin.

1735246487277.png


 
Son düzenleme:
saniyede 50 defa tetiklenecek bir timer kur buraya geldiğinde istediğin açıya denk gelecek zamanı hesapla ilgili pini H yap ve süre bitiminde pini low yapacak bir timer daha kur. ikinci timer int geldiğinde pini low yap ve bu timeri disable et.

SG90 vs fark etmiyor onlar marka model - bütün RC servolar aynıdır 6 volt besleme ver ve kontrol pininden 50hz 1ms genişlikli pwm uygula.
ödevi komple bitirmen gerekmiyor, yapabildiğin noktaya kadar getir ve sunumunu yap. hiç yapamamaktan çok daha iyidir.

16f877 işlemciyi 4mhz çalıştırmak zorunda değilsin. daha düşük 1mhz gibi frekanslarda da çalıştırabilirsin.

39319 eklentisine bak

deneyeceğim mutlaka. bir şey daha sormak istiyorum. Velev ki hayal ettiğim şeyi yetiştirdim ve ortaya bir ürün çıktı. Proje isterlerinden biri de uyku moduna sahip olması. yani kapatıp açıldıktan sonra kaldığı yerden devam etmesi isteniyor. wdt ile beraber interrupt mı kullanmam gerekecek? teşekkürler şimdiden
 
uyku modu diye benim anladığım aletin son açısal konumunu bir yere kaydedeceksin ve enerji gidip geldiğinde bu konumu hatırlayarak aynı açıya gelecek. 16f877 için eeprom olması lazım.
 
1735285194977.png

Harici osilatör kullanması sevmediğim birşey.
 
#include <16F877A.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock=20000000)

// Değişkenler
int16 pot_value;
int32 pwm_value;

// ADC Başlatma
void ADC_Init() {
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_32);
}

// Potansiyometreyi Okuma
unsigned int ADC_Read() {
set_adc_channel(0);
delay_us(20);
return read_adc();
}

// PWM Üretimi (Servo Motor)
void servo_control(int32 pwm_value) {
output_high(PIN_B0); // PWM başlat
delay_us(pwm_value); // PWM darbe genişliği (1-2 ms)
output_low(PIN_B0);
delay_ms(20 - (pwm_value / 1000)); // 20 ms tamamla (50 Hz)
}

// Ana Döngü
void main() {
set_tris_b(0x00); // PORTB çıkış
set_tris_a(0xFF); // PORTA giriş (ADC için)
output_b(0x00); // Başlangıçta motor kapalı

ADC_Init(); // ADC başlat

while (TRUE) {
pot_value = ADC_Read(); // Potansiyometre okuma
pwm_value = 1000 + ((int32)pot_value * 1000 / 1023); // 1 ms - 2 ms aralığı

if (pwm_value > 2000) pwm_value = 2000; // Maksimum 2 ms
if (pwm_value < 1000) pwm_value = 1000; // Minimum 1 ms

servo_control(pwm_value); // Servo motoru kontrol et
}
}
böyle bir kod var pot kontrolü için ancak sadece 0-45 arası gidiyor. neresi yanlış?
 
Kodlarınızı aşağıdaki gibi code tagleri içerisine alırsanız kodunuzun okunurluğu artar, cevap vermek isteyenlerin işini kolaylaştırmış olursunuz.

Kod:
#include <16F877A.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock = 20000000)

// Değişkenler
int16 pot_value;
int32 pwm_value;

// ADC Başlatma
void ADC_Init() {
  setup_adc_ports(AN0);
  setup_adc(ADC_CLOCK_DIV_32);
}

// Potansiyometreyi Okuma
unsigned int ADC_Read() {
  set_adc_channel(0);
  delay_us(20);
  return read_adc();
}

// PWM Üretimi (Servo Motor)
void servo_control(int32 pwm_value) {
  output_high(PIN_B0);  // PWM başlat
  delay_us(pwm_value);  // PWM darbe genişliği (1-2 ms)
  output_low(PIN_B0);
  delay_ms(20 - (pwm_value / 1000));  // 20 ms tamamla (50 Hz)
}

// Ana Döngü
void main() {
  set_tris_b(0x00);  // PORTB çıkış
  set_tris_a(0xFF);  // PORTA giriş (ADC için)
  output_b(0x00);    // Başlangıçta motor kapalı

  ADC_Init();  // ADC başlat

  while (TRUE) {
    pot_value = ADC_Read();  // Potansiyometre okuma
    pwm_value = 1000 + ((int32)pot_value * 1000 / 1023);  // 1 ms - 2 ms aralığı

    if (pwm_value > 2000) pwm_value = 2000;  // Maksimum 2 ms
    if (pwm_value < 1000) pwm_value = 1000;  // Minimum 1 ms

    servo_control(pwm_value);  // Servo motoru kontrol et
  }
}
 
Sorunuzun tam cevabı değil ama, gözüme çarpan bir iki hususa dikkatinizi çekmek isterim.

Belirtmediniz ama derleyici olarak sanırım CCS kullanıyorsunuz. Eğer öyleyse:

a- Adc çözünürlüğünü hesaplamarınızda 10bit olarak kullanıyorsunuz. Tanımlanmasa default kaç bit okuma yapıyor emin değilim. İşinizi garantiye almak için aşağıdaki kod satırını ilgili yere ekleyin. 10bit okumayı garanti altına alın.

Kod:
#include <16F877A.h>
#device adc = 10 // <<------------- 10bit adc
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock = 20000000)


b- Adcyi okumak için kullandığınız fonksiyonda dönüş değeri olarak unsigned int tipini kullandınız. CCS de int değişken tipi 8 bit veri barındırabilir. Nedeni: 16f877 8 bitlik mcu olduğu için.

Dolayısıyda return read_adc(); ile fonksiyon sonucu ( siz 10bit, 0...1023 arası bir değer okusanız bile) max 255 e kadar değer (daha doğrusu okunan adc değerinin LSB 8 biti) dönderilir. Bu fonksiyon dönüş değerinin hesaplamalara dahil edildiği yerlerde beklediğiniz sonuçlar üretmemesine neden olur.

Kod:
// Potansiyometreyi Okuma
unsigned int ADC_Read() { // 8 bit return
    ......
 
Son düzenleme:
İnt değerlerin karışmaması için; stdint.h kütüphanesini eklerim ve uint8_t, uint16_t, uint32_t, int8_t, vs. gibi tanımlamaları kullanırım. Kafa karışıklığı ortadan kalkar.
Kullanılmak istenmezse, yine bu kütüphane içine bakılarak değer aralıkları karşılaştırılabilir.
 
Sorunuzun tam cevabı değil ama, gözüme çarpan bir iki hususa dikkatinizi çekmek isterim.

Belirtmediniz ama derleyici olarak sanırım CCS kullanıyorsunuz. Eğer öyleyse:

a- Adc çözünürlüğünü hesaplamarınızda 10bit olarak kullanıyorsunuz. Tanımlanmasa default kaç bit okuma yapıyor emin değilim. İşinizi garantiye almak için aşağıdaki kod satırını ilgili yere ekleyin. 10bit okumayı garanti altına alın.

Kod:
#include <16F877A.h>
#device adc = 10 // <<------------- 10bit adc
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock = 20000000)


b- Adcyi okumak için kullandığınız fonksiyonda dönüş değeri olarak unsigned int tipini kullandınız. CCS de int değişken tipi 8 bit veri barındırabilir. Nedeni: 16f877 8 bitlik mcu olduğu için.

Dolayısıyda return read_adc(); ile fonksiyon sonucu ( siz 10bit, 0...1023 arası bir değer okusanız bile) max 255 e kadar değer (daha doğrusu okunan adc değerinin LSB 8 biti) dönderilir. Bu fonksiyon dönüş değerinin hesaplamalara dahil edildiği yerlerde beklediğiniz sonuçlar üretmemesine neden olur.

Kod:
// Potansiyometreyi Okuma
unsigned int ADC_Read() { // 8 bit return
    ......
teşekkür ederim sorun buymuş zaten unsigned 16ya çekince direkt uyuştu tüm değerler. Haklısınız hem belirtmem hem de taga almalıyım çok yeniyim forumlarda tecrübesizliğime verin lütfen
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
7,242
Mesajlar
122,552
Üyeler
2,925
Son üye
YusufAbali

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top