سلام . با میکروی آرم شماره LPC2368 یک برنامه ای نوشتم به این شرح:
قرار است یکی از ورودی های ADC را بخوانم. زمان خواندن این مقدار توسط ADC توسط پالس ورودی به یک پایه دیگر کنترل میشود. به این معنی که هر گاه پالس ورودی آن پایه "یک" باشد،مرتبا ADC خوانده شده و اعداد خوانده شده با هم جمع میشوند. و هر زمانی که صفر باشد این حاصل جمع تقسیم بر تعداد میشود. در واقع با هر پالس داده شده به آن پایه میکرو، میانگینی از ولتاژ ورودی به ADC گرفته میشود.
این تا اینجای کار . اما در ادامه متناسب با این مقدار میانگین، یک پالس بین 10 هرتز تا 10 کیلوهرتز باشد تولید شده و در خروجی قرار بگیرد. وقتی ولتاژ آنالوگ داده شده به ADC را با دست آرام تغییر میدهم مشکلی ایجاد نمیشود و پالس خروجی متناسب با آن تغییر فرکانس میدهد. اما اشکالی که من بهش برخوردم این است که وقتی این ولتاژ DC را سریع ( در حد کمتر از ثانیه) تغییر میدهم، فرکانس خروجی نمیتواند دقیق متناسب با آن تغییر کند. یعنی گیر میکند و بعد یکهویی به صورت پرشی تغییر میکند. کد برنامه را هم گذاشتم . ممنون میشوم اگر کسی راهنمایی کند.
قرار است یکی از ورودی های ADC را بخوانم. زمان خواندن این مقدار توسط ADC توسط پالس ورودی به یک پایه دیگر کنترل میشود. به این معنی که هر گاه پالس ورودی آن پایه "یک" باشد،مرتبا ADC خوانده شده و اعداد خوانده شده با هم جمع میشوند. و هر زمانی که صفر باشد این حاصل جمع تقسیم بر تعداد میشود. در واقع با هر پالس داده شده به آن پایه میکرو، میانگینی از ولتاژ ورودی به ADC گرفته میشود.
این تا اینجای کار . اما در ادامه متناسب با این مقدار میانگین، یک پالس بین 10 هرتز تا 10 کیلوهرتز باشد تولید شده و در خروجی قرار بگیرد. وقتی ولتاژ آنالوگ داده شده به ADC را با دست آرام تغییر میدهم مشکلی ایجاد نمیشود و پالس خروجی متناسب با آن تغییر فرکانس میدهد. اما اشکالی که من بهش برخوردم این است که وقتی این ولتاژ DC را سریع ( در حد کمتر از ثانیه) تغییر میدهم، فرکانس خروجی نمیتواند دقیق متناسب با آن تغییر کند. یعنی گیر میکند و بعد یکهویی به صورت پرشی تغییر میکند. کد برنامه را هم گذاشتم . ممنون میشوم اگر کسی راهنمایی کند.
#include "LPC23xx.h"
#include "stdio.h"
#include "math.h"
#include "LCD_4bit.h"
unsigned char buf[16],jbuf[16];
char i=1,cv;
float j=1,z=0,u,p,t,d;
unsigned short read_adc(void);
unsigned int k,s,m,y;
//////////////////////////////////////////Main
void main (void){
PINSEL0=0x03«12; //set P0.6 to MAT2.0
T2TCR=0x02; //Initialize Timer 2
T2EMR=0x31; //enable MAT2.0 and set toggle output
T2MR0=6000000; //set for delay 1s considering CLK_IN=36 MHz
T2CTCR=0x00; //select internal clock for Timer 2
T2MCR=0x02; // Reset and interrupt on match T2MR0
T2TCR=0x01; // start Timer 2
//////////////////////////////////////////
/*PINSEL4=1«22; //set P2.11 to EINT1
PINMODE4=3«22; //set P2.11 to pull-down
VICIntSelect=0; //set EINT0 interrupt to IRQ
VICIntEnable=1«15; //enable EINT0 interrupt
VICVectAddr15=(unsigned int)EINT1; //set address of T2_MR0 interrupt service routine
EXTMODE=0x03; //set EINT0 to edge sensitive
EXTPOLAR=0x02; //set rising edge for EINT0*/
/////////////////////////////////////
PINSEL1=0x01«14; //set P0.23 to AD0.0
PINMODE1=0x02«14; //set P0.23 as tri state
AD0CR=(1«21)|(3«8); //set PDN bit, and CLKDIV=3
/////////////////////////////////////
SCS|=0X01;
PINSEL2=0x00; //set P1 to GPIO
PINMODE2=0x02; //set P1 to tri state resistor
FIO1DIR=0X00;
/////////////////////////////////////
lcd_init(); //initialize LCD
sprintf(buf,"hello");
for(m=0;m<5;m++)
{
lcd_clear();
lcd_gotoxy(0,m);
lcd_print(buf); //clear LCD
for(s=0;s<120000;s++);
}
while(1)
{
while((FIO1PIN&0X01))
{
u+=read_adc(); //read AD0.0
j++;
}
if(j>0)
{
p=u/j;
y=(512/(19999*(p-512)-512))*36000000;
T2TCR=0x02;
T2MR0=y; //set for delay CLK_IN=36 MHz
T2TCR=0x01;
j=0;
u=0;
}
if(k>50000)
{
d=t/50000;
z=((d-512.0)*3.3)/1023.0; //convert result to voltage
lcd_gotoxy(0,0); //go to position (0,0)
sprintf(buf,"power=%f",z); //load ascii string to buf
lcd_print(buf);
lcd_gotoxy(1,0); //go to position (0,0)
sprintf(jbuf,"j=%f",j); //load ascii string to buf
lcd_print(jbuf); //write string
k=0;
t=0;
d=0;
}
k++;
t+=p;
}
}
///////////////////////////////////////////Read AD0.0
unsigned short read_adc(void)
{
AD0CR&=0xFFFFFF00;
AD0CR|=(1«24) |0X01; //start ADC conversion, and select AD0.0
while ((AD0DR0&0x80000000)==0); //wait for end of ADC Conversion
AD0CR&=0xF8FFFFFF; //stop ADC
return ((AD0DR0»6)&0x03FF); //return bit 6:15 of AD0DR0 that is 10 bit ADC value
}