PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل در آنالوگ به دیجیتال (adc)



mzarkoob
19-07-2011, 02:11
با سلام
در مجله شماره 10 صفحه 11 با عنوان پروژه شماره دو مثالی از تبدیل آنالوگ به دیجیتال برای LPC2378 ذکر شده است. من این برنامه را روی برد eke2lpc پروگرام کردم و پایه 4 تا 11 پورت صفر را هم به LED وصل کردم. پایه p0.23(AD00) را هم به عنوان ورودی آنالوگ استفاده می کنم. بعد از اجرا پایه آنالوگ چه به صفر ولت چه به 3.3 ولت وصل باشد در خروجی تغییری حاصل نمی شود!:( (البته یادم هم نرفته آدرس از 0x2000 شروع بشه!)
از دوستان کسی این برنامه را جواب گرفته!؟ ایراد از برنامه هست یا جایی تنظیم دیگری باید انجام بشه که من نکردم؟
البته در ادامه این بحث در شبیه سازی با keil که گفته در Function Editor کدهای زیر را کپی کنید:

signal void ADC0_tst (void) {
int a;
for (a = 0 ; a < 1024; i++) {
AD0DR0 = a;
swatch (0.001); // in 1000 uSec steps
}
a=0;
}

و Compile را کلید کنید و شبیه سازی را آغاز کنید.
در اینجا هم چیزی در شبیه سازی ندیدیم! (البته این برنامه خطا میده و باید i را هم به عنوان int معرفی کنیم). در مد شبیه سازی کجای کار ایراد داره که ورودی آنالوگ نداریم؟
البته نظر من روی سوال اولمه. چون برام مهمه در عمل بتونم این برنامه را اجرا کنم.

mzarkoob
21-07-2011, 02:23
یعنی کسی تا به حال آنالوگ به دیجیتال را تست نکرده!!!!!!؟؟؟:sa:

kavir
21-07-2011, 04:28
از توضیحات آقای تروشه استفاده کنید

kavir
21-07-2011, 04:39
adc.h




#ifndef __ADC_H
#define __ADC_H

#define ADC_VALUE_MAX 0xFFF

void ADC_Init (void);
void ADC_StartCnv(void);
void ADC_StopCnv (void);
uint32_t ADC_GetCnv (void);
uint16_t ADC_Get (void);

#endif /* end __ADC_H */






++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++
adc.c
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++

#include "adc.h"

/*----------------------------------------------------------------------------
initialize ADC Pins
*----------------------------------------------------------------------------*/
void ADC_Init (void) {

LPC_PINCON->PINSEL3 &= ~(3UL<<30); /* P1.31 is GPIO */
LPC_PINCON->PINSEL3 |= (3UL<<30); /* P1.31 is AD0.5 */

LPC_SC->PCONP |= (1<<12); /* Enable power to ADC block */

LPC_ADC->ADCR = (1<< 5) | /* select AD0.5 pin */
(4<< 8) | /* ADC clock is 25MHz/5 */
(1<<21); /* enable ADC */
}

/*----------------------------------------------------------------------------
start ADC Conversion
*----------------------------------------------------------------------------*/
void ADC_StartCnv (void) {
LPC_ADC->ADCR &= ~(7<<24); /* stop conversion */
LPC_ADC->ADCR |= (1<<24); /* start conversion */
}


/*----------------------------------------------------------------------------
stop ADC Conversion
*----------------------------------------------------------------------------*/
void ADC_StopCnv (void) {
LPC_ADC->ADCR &= ~(7<<24); /* stop conversion */
}

/*----------------------------------------------------------------------------
get converted ADC value
*----------------------------------------------------------------------------*/
uint32_t ADC_GetCnv (void) {
uint32_t adGdr;
// uint32_t adDr2;

while (!(LPC_ADC->ADGDR & (1UL<<31))); /* Wait for Conversion end */
adGdr = LPC_ADC->ADGDR;
// adDr2 = LPC_ADC->ADDR2;
return((adGdr >> 4) & ADC_VALUE_MAX); /* read converted value */
}

/*------------------------------------------------------------------------------
read a converted value from the Analog/Digital converter
*------------------------------------------------------------------------------*/
uint16_t ADC_Get (void) {
uint16_t val;

ADC_StartCnv(); /* start A/D conversion */
val = ADC_GetCnv(); /* use upper 8 bits of 12 bit AD conversion */
ADC_StopCnv(); /* stop A/D conversion */

return (val);
}

mzarkoob
21-07-2011, 15:52
من برنامه آقای تروشه را هم پروگرام کرده بودم. در این برنامه گفته شده اگر پایه p0.23(ADC0.0 پایه شماره 55 روی برد) را هم به عنوان ورودی آنالوگ استفاده می کنم و از 100 بیشتر شود پایه p0.21 (پایه شماره 51 روی برد) روشن می شود. یعنی اگه ورودی را از ولتاژ 0 به 3.3 وصل کنیم باید روشن بشه . ولی این برنامه به این صورت است که بعد از اجرا led نیمه روشن است(در حالی که باید خاموش باشه) و با وصل کردن ADC0.0 به ولتاژ 3.3 پر نورتر می شود!
برای همین به برنامه ها شک کردم و سوال مطرح کردم.(نمی دونم Vref در برد از داخل به جایی وصل هست؟) گفتم کسی این برنامه را پروگرام کرده و جواب گرفته؟ یا ایراد از منه!
من روی برنامه هایی که گذاشتید هم کار می کنم تا ببینم به چه صورت در میاد.

alireza9900
21-07-2011, 16:58
منظورتون از نیمه روشن اینه که انگار یه نقطه از led روشنه ؟

mzarkoob
21-07-2011, 21:06
یعنی نورش کمه در حالی که باید خاموش باشه

t.o.e
22-07-2011, 02:32
سلام:
شما لطف کنید برنامه تونو کامل پیوست کنید تا دوستان برنامه تون رو تست بگیرند.
اینطوری سریعتر به نتیجه خواهید رسید.

موفق و موید باشید.

mzarkoob
22-07-2011, 11:24
بله . حتما
فایل اول(ADC.LPC) که برنامه خود مجله شماره 10 می باشد. در این برنامه بعد از اجرا بعضی led ها کم نورند و با تغییر رنج ولتاژ ورودی آنالوگ تغییری درآنها حاصل نمی شود.
فایل دوم(adc)هم که برنامه آقای تروشه می باشد که شرح آن گذشت.از دوستان خواستند این برنامه ها رو تست کنند تا مشخص بشه جواب میده
با تشکر

kavir
22-07-2011, 12:14
برای برنامه اقای تروشه FIO0CLR= 0xFFFFFFFF; اگر اشتباه نکنم باید به این تغییر بدین و همچنین نمونه برنامه در بخش مثالهای ال پی سی بود که ورودی و خروجی ها براش مثال گذاشتیم


#include <LPC23xx.h>

/* LED Definitions */

#define LED_MSK 0x000000FF /* P3.0..7 */
#define LED_RD 0x00000001 /* P3.0 */
#define LED_WR 0x00000002 /* P3.1 */
#define LED_CFG 0x00000004 /* P3.2 */
#define LED_SUSP 0x00000008 /* P3.3 */
void delay(unsigned long i);


void key_read()
{
if((FIO2PIN & 1<<11)==0)
{
FIO3SET = LED_WR; /* Turn On Write LED */
FIO3SET=LED_RD;
FIO3SET=LED_CFG;
FIO3SET=LED_SUSP;
// delay(2000000);
FIO3CLR = LED_WR; /* Turn On Write LED */
FIO3CLR=LED_RD;
FIO3CLR=LED_CFG;
FIO3CLR=LED_SUSP;
// delay(2000000);
}

}

int main()
{
PINSEL6=0x00; // Set For GPIO
SCS |= 0x00000001; //Fast Mode
FIO3MASK= 0x00000000;// If=0 All = Fast Mode
FIO3DIR= 0xFFFFFFFF; //If=1 out put Else if=0 = input
FIO3SET= 0xFFFFFFFF;
FIO3CLR= 0xFFFFFFFF;
PINSEL10 = 0; // Disable ETM interface, enable LEDs
// P2[0:7] = GPIO Function(xxxx 0000 0000 0000 0000 0000 0000 0000)
PINSEL4 = 0x00FF;
// Enable Pull-Up P2[0:7] (0101 1111 1111 1111 1111 1111 1111 1111)
PINMODE4 = 0x0000;
// Set GPIO-2[0:7] = Output(xxxx xxxx xxxx xxxx xxxx xxxx 1111 1111)
FIO2DIR = 0x00000000;

while(1)
{

key_read();
}
}
void delay(unsigned long i)
{
unsigned long j;
for (j=0;j<i;j++);
}

mzarkoob
22-07-2011, 22:06
تغییری که فرموده بودید (برای برنامه اقای تروشه FIO0CLR= 0xFFFFFFFF) را هم اعمال کردم. تغییری حاصل نشد!
در مورد مثالی که "نمونه برنامه در بخش مثالهای ال پی سی که برای ورودی و خروجی ها می باشد"، این برنامه مشکلی نداره و من هم اجرا کردم، ولی این برنامه مربوط به ADC نمی شود.
چیزی که در آنالوگ به دیجیتال ما لازم داریم مقداری است که می خواند(i = AD0DR0) یعنی برنامه ای که این مقدار را بخواند(0 تا 1024) و از آن استفاده کند.

kavir
22-07-2011, 23:50
دوست عزیز این برنامه با سرعت بالا اجرا میشه و اینکه با چشم بتونید تشخیص بدین ال ای دی کی خاموش روشن میشه نیست
شما برای کار با آرم بدون دیباگر 50 درصد عقب هستی
wigler یا جیلینک بسازید و یا بخرید و دیباگ کنید

mzarkoob
23-07-2011, 02:30
بله شما درست میگید. . تو چند تا تایپیک هم مطرح کرده بودید که وقتی با جیلینگ برنامه را دیباگ کردید سریع مشکل را پیدا کردید.
من برنامه آقای تروشه را یک بار دیگه پروگرام کردم. فکر کنم درست شد. یعنی بعد از پروگرام کردن در حالی که ورودی آنالوگ زمین است led خاموش است و وقتی مقدار ورودی را زیاد می کنیم led روشن می شود. البته آخر دلیل این نیمه روشن بودن را نفهمیدم. چون الان که خاموشه دلیلش اینه که دو تا از پایه های p0.4 تا p0.11 را هم به led وصل کردم(و زمین کردم). هر چند در این برنامه هیچ ایفای نقشی برای آنها تعریف نشده!(اینم اتفاقی فهمیدم)

mzarkoob
27-07-2011, 21:21
با سلام
بالاخره یه برنامه نوشتم برای آنالوگ به دیجیتال که منو به هدفم برسونه و روی برد جوابم بده.:018:
شرح برنامه:
در این برنامه مقدار ولتاژ ورودی که از ADC0 (پایه p0.23 با شماره 55 شماتیک) اعمال می شود، با استفاده از یک پتانسومتر 10K قابل تغییر است. با کم و زیاد کردن مقدار آن، led های روی برد که پایه p3.0 تا p3.7 می باشد چشمک می زند. اینکه کدامیک چشمک می زند بستگی به سطح ولتاژ اعمالی دارد.
در بالای برد پایه vref را به 3.3 وصل کنید.
این یک مثال ساده است که بستگی به کاربردتان قابل تغییر است.
فقط قبل از گرفتن اون دگمه تشکر را بزنید ، اگه جواب نداد برگردید پس بگیرید!:wink:

kavir
27-07-2011, 22:21
با سلام
بالاخره یه برنامه نوشتم برای آنالوگ به دیجیتال که منو به هدفم برسونه و روی برد جوابم بده.:018:
شرح برنامه:
در این برنامه مقدار ولتاژ ورودی که از ADC0 (پایه p0.23 با شماره 55 شماتیک) اعمال می شود، با استفاده از یک پتانسومتر 10K قابل تغییر است. با کم و زیاد کردن مقدار آن، led های روی برد که پایه p3.0 تا p3.7 می باشد چشمک می زند. اینکه کدامیک چشمک می زند بستگی به سطح ولتاژ اعمالی دارد.
در بالای برد پایه vref را به 3.3 وصل کنید.
این یک مثال ساده است که بستگی به کاربردتان قابل تغییر است.
فقط قبل از گرفتن اون دگمه تشکر را بزنید ، اگه جواب نداد برگردید پس بگیرید!:wink:

سلام
فعلا وقت تستش نمیشه ولی جواب قطعی بگیرید اینجا بذارید
کلیه آموزش ها و نکات مهم برد eke2lpc v1.0 کویرالکترونیک - ایـــــــــران میـــــــکرو ™ (You can see links before reply)
با تشکر:wink:

Number20
18-11-2013, 00:51
سلام با تشکر از آقای زرکوب

arasbaran
22-01-2014, 00:52
سلام
من با adc0 جواب میگیرم
ولی وقتی میخوام از adc1 یا adc2 استفاده کنم جواب نمیده
هدف برنامه ام اینه که همزمان 3 خط رو بخونه و تبدیل به دیجیتال کنه