ايران ويج

نسخه‌ی کامل: اسیلوسکوپ با AVR
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام به همه

بچه من یه اسیلوسکو طراحی کردم (البته با یه مقدار کپی برداری)ولی یک سر مشکلات داشتم هم توی برنامه نویسی هم تو مدارش .

اولین مشکلام اینکه خیلی نویز دارم

دومی اینکه مدار برای بالا پایین کردن دامنه سیگنال لازم دارم البته چندتایی پیدا کردم ولی دقیق نیستن (می خوام این پروژه عملی کنم)

سومی چرا توی پرتئوس نمی تونم این مدار هارو اجرا کنم فکر کنم از این باشه که از متن توی lcd استفاده می کنم وقتی کد
کد:
$regfile = "M32def.dat"
$crystal = 8000000
$lib "glcdKS108.LBX"
$include "my6_8.font"
$include "Font5x5.font"
$hwstack = 64
$swstack = 64
$framesize = 64

Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portc , _
Ce = 0 , Ce2 = 1 , Cd = 2 , Rd = 3 , Reset = 4 , Enable = 5 , Mode = 8
Config Adc = Single , Prescaler = Auto , Reference = Internal

Config Portd = Input
'*******************************************************************************
Dim A As Word , B As Word , C As Word , D As Bit , E As Bit , Fr1 As Single
Dim Fr2 As Single , V1 As Single , V2 As Single , Speed As Word , F As Word
Dim Wiat As Word
Dim Aa As Long , Bb As Byte , Ii As Long
Config Single = Scientific , Digits = 1

'********************************timer *****************************************
Config Timer1 = Counter , Edge = Rising
Ddra.1 = 0
Porta.1 = 1
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Enable Timer0
Enable Interrupts
'*******************************************************************************

Bb = 0
D = 0
E = 0
Speed = 1
Setfont Font5x5
Cls Graph
Cls
Do

Cls
Showpic 0 , 0 , Pic0
Wait 4
Exit Do
Loop
'surc
Cls Graph

Do
'*******************control****************************
Showpic 0 , 0 , Pic1
If Pind.2 = 1 And Speed < 1000 Then
Incr Speed
Lcdat 32 , 50 , "speed :" ; Speed , 1
End If
If Pind.3 = 1 And Speed > 0 Then
Decr Speed
Lcdat 32 , 50 , "speed :" ; Speed , 1
End If
If Pind.4 = 1 And Wiat < 2000 Then
Incr Wiat
Lcdat 32 , 50 , "time :" ; Wiat , 1
End If
If Pind.5 = 1 And Wiat > 0 Then
Decr Wiat
Lcdat 32 , 50 , "time :" ; Wiat , 1
End If
'*********************select ch1/ch2*******************
If Pind.0 = 1 And D = 0 Then
D = 1
Showpic 97 , 1 , Ch1 , 1
While Pind.0 = 1
Wend
Elseif Pind.0 = 1 And D = 1 Then
D = 0
Showpic 97 , 1 , Ch1
While Pind.0 = 1
Wend
Elseif D = 0 Then
Showpic 97 , 1 , Ch1
End If
If Pind.1 = 1 And E = 0 Then
E = 1
Showpic 112 , 1 , Ch2 , 1
While Pind.1 = 1
Wend
Elseif Pind.1 = 1 And E = 1 Then
E = 0
Showpic 112 , 1 , Ch2
While Pind.1 = 1
Wend
Elseif E = 0 Then
Showpic 112 , 1 , Ch2
End If
'*********************show signal**********************
'---------------------------line 1----------------------
If D = 1 Then
For A = 0 To 96
F = Getadc(0)
B = F / 16
B = 64 - B
V1 = F / 204.6
Pset A , B , 255
For C = 1 To Speed
Waitus 1
Next C
Next A
End If
'-----------------------line 2---------------------
If E = 1 Then
For A = 0 To 96
F = Getadc(4)
B = F / 16
B = 64 - B
V2 = F / 204.6
Pset A , B , 255
For C = 1 To Speed
Waitus 1
Next C
Next A
End If
'********************show other objct******************
Line(96 , 12) -(128 , 12) , 255
Lcdat 3 , 97 , "F1:"
Lcdat 4 , 97 , Fr1 ; "Hz"
Lcdat 5 , 97 , "F2:"
Lcdat 6 , 97 , Fr2 ; "Hz"
Lcdat 7 , 97 , "V1:" ; V1
Lcdat 8 , 97 , "V2:" ; V2

Waitms Wiat
Loop

Pic0:
$bgf "arm.bgf"
Pic1:
$bgf "as.bgf"
Ch1:
$bgf "Ch1.bgf"
Ch2:
$bgf "ch2.bgf"

البته کامل نیست هنوز فرکانس مترو ننوشتم (درمورد اونم مشکل دارم)
video

http://www.injairane.ir/uplodfile/IMAG0017.jpg
به نظر من که خوب اومد
برای بالا و پایین کردن باید یه ولتاژ رو باهاش جمع کنی که می تونی با یه opamp‌ اینکارو بکنی که گین هم بهت می ده
برای کوپلینگ ها هم کافیه یه خازن سر راهش بزاری و یا اتصال کوتاهش کنی
برای نویز هم اول یه ولتاژ بدون نوبز بهش بده ببین چی می شه فکر کنم دستت رو گذاشته بودی بهش خود اسکوپ عادی هم نویز می گیره اینجوری
بین نقاط هم باید خط بکشی نه اینکه فقط نقاط رو نشون بدی
و باید PCB‌هم داشته باشه اینجوری نیم شه نویزش رو بررسی کرد
مرسی آقا هادی

الان یکی از مشکلاتم اینه که نمی تونم فرکانس محاسبه کنم توی این خیلی مشکل دارم هرکری می کنم نمی تونم باعث اختلال روی کار نمایش میشه نمی دونم چی کار کنم ؟؟؟

یه مشکل اساسی دیگمم اینکه برنامرو که نوشتم وقتی توی پرتئوس اجرا می کنم پر تئوس خطا میده
منظورتون نفهمیدم بین نقاط باید خط بکشم
[تصویر:  8lrvm896n0ww50onrkzn.bmp]

یعنی بین این نقاط
یه مداره ساده برای کنترل دامنه و AC/DC اسکوپ

[تصویر:  6s6i2e5wawza13s6sve.png]
این برنامه پرتئوس
مشکل پرتئوس هم حل شود باید فونت آخر برنامه تعریف می کردم

کد
کد:
$regfile = "M32def.dat"
$crystal = 8000000
$lib "glcdKS108.LBX"

$hwstack = 64
$swstack = 64
$framesize = 64

Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portc , _
Ce = 0 , Ce2 = 1 , Cd = 2 , Rd = 3 , Reset = 4 , Enable = 5 , Mode = 8
Config Adc = Single , Prescaler = Auto , Reference = Internal

Config Portd = Input
'*******************************************************************************
Dim A As Word , B As Word , C As Word , D As Bit , E As Bit , Fr1 As Single
Dim Fr2 As Single , V1 As Single , V2 As Single , Speed As Word , F As Word
Dim Wiat As Word
Dim Aa As Long , Bb As Byte , Ii As Long
Config Single = Scientific , Digits = 1

'********************************timer *****************************************
Config Timer1 = Counter , Edge = Rising
Ddra.1 = 0
Porta.1 = 1
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Enable Timer0
Enable Interrupts
'*******************************************************************************

Bb = 0
D = 0
E = 0
Speed = 1
Setfont Font5x5
Cls Graph
Cls
Do

   Cls
   Showpic 0 , 0 , Pic0
   Wait 4
   Exit Do
Loop
'surc
Cls Graph

Do
'*******************control****************************
    Showpic 0 , 0 , Pic1

    If Pind.2 = 1 And Speed < 1000 Then
      Incr Speed
    End If
    If Pind.3 = 1 And Speed > 0 Then
      Decr Speed
    End If
    If Pind.4 = 1 And Wiat < 2000 Then
      Incr Wiat
    End If
    If Pind.5 = 1 And Wiat > 0 Then
      Decr Wiat
    End If
    Showpic 0 , 0 , Pic1

'*********************select ch1/ch2*******************
    If Pind.0 = 1 And D = 0 Then
    D = 1
    Showpic 97 , 1 , Ch1 , 1
    While Pind.0 = 1
    Wend
    Elseif Pind.0 = 1 And D = 1 Then
    D = 0
    Showpic 97 , 1 , Ch1
    While Pind.0 = 1
    Wend
    End If
    '////////////////////
    If Pind.1 = 1 And E = 0 Then
    E = 1
    Showpic 112 , 1 , Ch2 , 1
    While Pind.1 = 1
    Wend
    Elseif Pind.1 = 1 And E = 1 Then
    E = 0
    Showpic 112 , 1 , Ch2
    While Pind.1 = 1
    Wend
    End If
'*********************show signal**********************
'---------------------------line 1----------------------
    If D = 1 Then
      For A = 0 To 96
      F = Getadc(0)
      B = F / 16
      B = 64 - B
      V1 = F / 204.6
      Pset A , B , 255
      For C = 1 To Speed
         Waitus 1
      Next C
      Next A
     End If
     '-----------------------line 2---------------------
     If E = 1 Then
      For A = 0 To 96
      F = Getadc(4)
      B = F / 16
      B = 64 - B
      V2 = F / 204.6
      Pset A , B , 255
      For C = 1 To Speed
         Waitus 1
      Next C
      Next A
     End If
'********************show other objct******************
    Line(96 , 12) -(128 , 12) , 255
    Lcdat 3 , 97 , "F1:"
    Lcdat 4 , 97 , Fr1 ; "Hz"
    Lcdat 5 , 97 , "F2:"
    Lcdat 6 , 97 , Fr2 ; "Hz"
    Lcdat 7 , 97 , "V1:" ; V1
    Lcdat 8 , 97 , "V2:" ; V2

    Waitms Wiat
Loop


   $include "Font5x5.font"
Pic0:
   $bgf "arm.bgf"
Pic1:
   $bgf "as.bgf"
Ch1:
   $bgf "Ch1.bgf"
Ch2:
   $bgf "ch2.bgf"
کسی نیست کمک کنه ؟؟؟؟

من در مورد اندازه گیری فرکانس مشکل دارم و همین طور مدار کنترل دامنه

سلام.

من هنوز برنامه رو نخوندم ، اما مي خونم ...
فركانس رو چطور مي خواي اندازه بگيري ؟ مي خواي به صورت عدد نشون داده بشه ؟
براي اينكار مي توني از timer استفاده كني يا از يه تابع استفاده كني ( اسمش يادم نيست !! )
كنترل دامنه مي خواي به چه صورت باشه ؟ منظورت stretch كردن هست يا pan كردن ؟
براي pan اگر مدام در حال نمونه گيري هست ، كه بايد يه مقدار DC رو باهاش جمع كني (با مدار جمع كننده ي اپ امپ ) ،
اما اگر بعد از نمونه گيري ذخيره مي شه و ديگه نمونه گيري نمي كنه ، با استفاده از دستورات lcd فكر مي كنم بشه ...

براي حالت DC/AC هم ( همونطور كه خودت مي دوني ) از يك خازن متناسب با فركانس بايد استفاده كني ، كه اگر در مدار باشه ، مي شه AC و اگر نباشه ، مي شه DC ...

موفق باشي.
يا علي.

برای اندازه گیری فرکانس ۲ راه داری یکی شمردن تعداد پالس ها توی یک زمان مشخص مثلا یک دهم ثانیه و یکی هم اندازه گیری زمان بین ۲ عبور از یک نقطه مشخص اونم مثلا بالا رونده
روش اول توی فرکانس های بالا و روش دوم توی فرکانس های پایین جواب می ده
از روی زمانه نمونه برداری م یتونه روش رو انتخاب کنی
برای هر دو روش باید عبور از اون نقطه رو تشخیص بدی که یه if می خواد
در کل هر دوروش برای شکل موج های پیچیده جواب نمی ده
یه روش دیگه که هست ۲ تا خط روی صفحه نشون می دن که کار بر می برتشون روی ابتدا و انتهای شکل موج دیگه کاری به شکل موج ندارن از اون ۲ تا خط و زمان نمونه گیری فرکانش رو حساب می کنن
مرسی آقا هادی

فکر کنم روش اخر خوب باشه اینجوری جالب تر هم میشه ......
فقط باید این کار کنم دیگه :

دوتا خط تعریف می کنم که روی محور X حر کت میکنه بعد از مکان یابی دقیق ..وقتی اون ردیف پیکسل 1 شود تایمر شروع به کار میکنه و تازمانی که به انتهایی برسه میشماره و 1 تقسیم بر این زمان میشه فر کانس ...
نه دیگه تایمر نمی خواد
شما سرعت نمونه برداری رو می دونی چون خودت تنظیم کردی مثلا هر نمونه (پیکسل) توی یک میلی ثانیه گرفته می شه دو تا خط رو هم که خودمون کشیدیم مثلا یکی روی پیکسل ۲۵ اون یکی روی ۷۵ یعنی ۵۰ پیکسل بین ۲ خط فاصله هست که می شه ۵۰ میلی ثانیه پس فرکانش می شه ۱/۵۰ کیلو
سلام میتونی فایل پروتئوس این برنامه رو برای بفرستی .شدیدا لازم دارم

اینم ایمیلم
abasihamid40@gmail.com
در پست شماره 4 وجود دارد