تبدیل 6 پایه به 48 پایه ADC با میکرو میگا8 (با ایسی4051)

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

ارسال پست
Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

تبدیل 6 پایه به 48 پایه ADC با میکرو میگا8 (با ایسی4051)

پست توسط sinaset » دو شنبه 7 تیر 1395, 11:39 am

بنام خداوند بخشنده ومهربان
باسلام


تبدیل 6 پایه به 48 پایه ADC با میکرو میگا8 (با ایسی4051)

در این برنامه جالب به کمک 6 ایسی 4051 مالتی پلکسر ، 6 پایه ADC تبدیل به 48 پایه ADC مبدیل آنالوگ به دیجیتال کرده ایم. تصویر ایسی 4051

این ایسی، می تواند هشت پایه خود را به کمک روش مولتی پلکسر به یک پایه تبدیل و ان را برای میکروکنترولر بفرستد. (*این ایسی می تواند،هم اطلاعاتی را دریافت کند،همه اطلاعاتی را ارسال کنند،که به این دو حال،مالتی پلکسر و دی مالتی پلکسر گفته میشود)

این ایسی،سه پایه Aو B و C دارد،که ما با تعویض وضعیت این سه پایه می توانیم یکی از هشت پایه مد نظرمان را انتخاب کنیم.
 تصویر   که در تصویر بالا می ببینید، سه پایه ABC برای انتخاب 8 پایه می باشد. (که با IN/OUT در تصویر بالا معرفی شده اند). تصویر   کمک جدول بالا و قرار دادن پایه ها ABC در وضعیت ذکر شده،می توانید، پایه های x0 تا x7 ایسی را انتخاب کنید.   *لازم به ذکر است،همانجور که در انتها جدول می ببینید با قرار دادن پایه Inhibit در وضعیت 1،می توانید بطور کل هیچ پایه ی را انتخاب نکنید.! (اما در وضعیت معمولی باید صفر یا GND باشد)   7 و 8 ایسی به GND اتصال پیدا می کند،پایه 16 به مثبت (از 3 تا 18 ولت)  اما برنامه   نوشته شده،می تواند 48 ولتاژ مختلف را به کمک ایسی ها بخواند و به ترتیب به پایه ها ADC میکروکنترولر بدهد (طبق زمان بندی انجام شده ) سپس ولتاژ ذکر شده را بر روی LCD نمایش بدهد .  *در برنامه نوشته،تک تک ولتاژها از ایسی اول،یکی یکی خوانده، سپس بر روی LCD نمایش داده میشود .  برنامه نویسی:   راحتی کار،یک تابع و سه شناسه در ابتدا کار نوشته شده،تا نیازی به حفظ کردن جدول ایسی 4051 نباشد.   سه پایه میکروکنترولر که به پایه ABC وصل شده انده،معرفی   

کد: انتخاب همه

#define A PORTD.0
#define B PORTD.1
#define C PORTD.2


سپس به کمک تابع زیر،می توانید پایه مد نظرتان را انتخاب کنید :

کد: انتخاب همه

void pin_x(unsigned char in)   //تابع براي انتخاب پايه
{
if(in==0) A=0,B=0,C=0;    //انتخاب پايه اول
if(in==1) A=1,B=0,C=0;    //انتخاب پايه دوم
if(in==2) A=0,B=1,C=0;    //انتخاب پايه سوم
if(in==3) A=1,B=1,C=0;    //انتخاب پايه چهارم
if(in==4) A=0,B=0,C=1;    //انتخاب پايه پنجم
if(in==5) A=1,B=0,C=1;    //انتخاب پايه ششم
if(in==6) A=0,B=1,C=1;    //انتخاب پايه هفتم
if(in==7) A=1,B=1,C=1;    //انتخاب پايه هشتم
}


به عنوان مثال اگر می خواهید،پایه شماره صفر ایسی فعال شود،کافیست در برنامه بنویسی (pinx_(0 تا پایه 0 انتخاب شود .

توضیحات رو مختصر می کنم،بهتر است برای درک بهتر مطالب،شبیه ساز و کدهای رو ببینید و آزمایش کنید.

کدها:

کد: انتخاب همه

/*******************************************************
Project :IC 4051 48 pin adc
Version :1.0
Date    : 1395.3.25
Author  : sinaset

Chip type         : ATmega8A
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <delay.h>
#include <alcd.h>
#include <stdio.h>
#define A PORTD.0     //معرفي پايه ها اتصال يافته به ايسي 4051
#define B PORTD.1
#define C PORTD.2
#define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))   

unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSRA|=(1<<ADSC);
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}

void pin_x(unsigned char in)   //تابع براي انتخاب پايه
{
if(in==0) A=0,B=0,C=0;    //انتخاب پايه اول
if(in==1) A=1,B=0,C=0;    //انتخاب پايه دوم
if(in==2) A=0,B=1,C=0;    //انتخاب پايه سوم
if(in==3) A=1,B=1,C=0;    //انتخاب پايه چهارم
if(in==4) A=0,B=0,C=1;    //انتخاب پايه پنجم
if(in==5) A=1,B=0,C=1;    //انتخاب پايه ششم
if(in==6) A=0,B=1,C=1;    //انتخاب پايه هفتم
if(in==7) A=1,B=1,C=1;    //انتخاب پايه هشتم
}

void main(void)
{
float x=0.0;
unsigned char i=0,m;
unsigned char str[16];

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);

DDRD=0xff;
PORTD=0x00;
lcd_init(16);

while (1)
    {
      for(m=0;m<6;m++){

       for(i=0;i<8;i++){
       pin_x(i),x=read_adc(m)*0.00488;
       sprintf(str,"Volt:%.1f  PIN:%d",x,i); 
       lcd_gotoxy(0,0);
       lcd_puts(str);
       sprintf(str,"IC:%d",m); 
       lcd_gotoxy(0,1);
       lcd_puts(str);
       delay_ms(800);
       }
      }
    }
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و برنامه.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 1
تاریخ عضویت: شنبه 28 اسفند 1395, 6:23 pm

Re: تبدیل 6 پایه به 48 پایه ADC با میکرو میگا8 (با ایسی4051)

پست توسط mostafa ch » شنبه 28 اسفند 1395, 7:12 pm

سلام و خسته نباشید میگم نمیشه این پروژه رو با زبان بیسیک نوشت؟

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

Re: تبدیل 6 پایه به 48 پایه ADC با میکرو میگا8 (با ایسی4051)

پست توسط sinaset » شنبه 28 اسفند 1395, 8:36 pm

سلام بر شما
تشکر از نظرتون. نباید مشکل بخصوصی باشه،ولی اینجانب برنامه نویسی بسکام بسیار ضعیف می باشد.
اگر بخواهید می توانید از فایل هگز برنامه برای طرحتان استفاده کنید..
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”