با سلام.
وقت همگی به خیر.
من میخوام از ADC با فرکانس نمونه برداری 10 الی 20 کیلو هرتز نمونه برداری کنم و مدت زمان مثلا یک الی چند دقیقه و نمونه ها در کارت SD ذخیره بشه و بعد برای پردازش به متلب انتقال داده بشه. حقیقتش میکرو مورد استفاده DSP هست ولی چون انجمن DSP دیگه تقریبا فعالیتی نداره گفتم اینجا بپرسم شاید که بهتر بشه کمک کرد.
الان مشکلی که دارم اینه که نرخ نمونه برداری درست نیست و یک سری از داده ها از دست میره.
کد نوشته شده :
توضیح کد :
دو تا بافر تعریف کردم که ابتدا اولی پر بشه و بعدش دومی توی حلقه while هم میاد چک میکنه که اگر بافر ها کامل پر شدن اون وقت شروع به نوشتن در داخل کارت SD میکنیم. الان همون طور که در ادامه عکسش رو گذاشتم یک سری از داده ها نوشته نمیشه و عملا مشکل داره . علتش هم فکر کنم این باشه که زمان نوشتن داخل کارت SD خیلی طولانی هست. چون متغیر m اضافه شده ولی داخل بافر ها نوشته نشده . میخواستم ببینم راه کاری برای رفع این مشکل هست یا نه ؟ توی این برنامه فرکانس نمونه برداری خیلی زیاده ولی وقتی کمش هم میکنم باز همین مشکل رو دارم. در واقع میخوام ببینم این الگوریتم خوبه یا اینکه الگوریتم رو باید عوض کرد . ممنون میشم راهنمایی کنید.
اینم از عکس محتویات کارت SD که اعداد ناگهانی پرش میکنند.

این رو هم اضافه کنم که علت شیفت به راست اعدا اینه که متغیر unsigned char در این سری از dsp هشت بیتی هست و برای نوشتن روی کارت SD باید 8 بیت بالا و پایین را توی دو تا خونه جداگانه نوشت.
خیلی ممنون.
وقت همگی به خیر.
من میخوام از ADC با فرکانس نمونه برداری 10 الی 20 کیلو هرتز نمونه برداری کنم و مدت زمان مثلا یک الی چند دقیقه و نمونه ها در کارت SD ذخیره بشه و بعد برای پردازش به متلب انتقال داده بشه. حقیقتش میکرو مورد استفاده DSP هست ولی چون انجمن DSP دیگه تقریبا فعالیتی نداره گفتم اینجا بپرسم شاید که بهتر بشه کمک کرد.
الان مشکلی که دارم اینه که نرخ نمونه برداری درست نیست و یک سری از داده ها از دست میره.
کد نوشته شده :
#include "F28x_Project.h"
#include "fatfs/src/ff.h"
#include "fatfs/src/diskio.h"
#include "fatfs/src/integer.h"
#define numsample 1 // number of ADC sample
void configuretimer1 (void);
void configureADC (void);
interrupt void adca1_isr (void);
unsigned char Buf1[512],Buf2[512];//adc1[20],adc2[20],adc3[20]; // result of adc conversion
uint16_t i=0,j=0;
uint32_t counter=0;
FATFS fs;
FIL fp;
WORD btw = 200; //Number of bytes to write
WORD bw; //Pointer to number of bytes written
unsigned char Buf1Full = 'N';
unsigned char Buf2Full = 'N';
void main(void)
{
FRESULT Fres;
InitSysCtrl();
DINT; // disable global interrupt
InitPieCtrl();
InitPieVectTable();
EALLOW;
PieVectTable.ADCA1_INT = &adca1_isr;
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
IER |= M_INT1; //Enable group 1 interrupts
EINT;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
// set gpio31 as GPIO
GpioCtrlRegs.GPAGMUX2.bit.GPIO22 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;
// set GPIO31 as output
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO22 = 1;
EDIS;
while(disk_initialize(0) == STA_NOINIT);
Fres = f_mount(0,&fs);
while( Fres != FR_OK);
Fres = f_open(&fp, "ADC.txt", FA_CREATE_ALWAYS | FA_WRITE);
while( Fres != FR_OK);
/*Fres = f_lseek(&fp,10485760);
while( Fres != FR_OK);
Fres = f_lseek(&fp, 0);
while( Fres != FR_OK);*/
configureADC();
configuretimer1();
while(1)
{
if (Buf1Full == 'Y')
{
//GpioDataRegs.GPATOGGLE.bit.GPIO22 = 1;
f_write(&fp,Buf1, sizeof(Buf1), &bw);
Buf1Full = 'N';
//GpioDataRegs.GPATOGGLE.bit.GPIO22 = 1;
//counter++;
}
else if (Buf2Full == 'Y')
{
f_write(&fp,Buf2, sizeof(Buf2), &bw);
Buf2Full = 'N';
counter++;
}
if (counter == 2*numsample)
{
f_close(&fp);
asm(" ESTOP0");
}
}
}
void configuretimer1 (void)
{
CpuTimer1Regs.TCR.bit.TIE = 1; // enable timer1 interrupt
CpuTimer1Regs.TCR.bit.FREE = 1; // FREE:SOFT = 3 for free runs
CpuTimer1Regs.TCR.bit.SOFT = 1;
CpuTimer1Regs.TPRH.bit.TDDRH = 0; // TDDRH:TDDR = 9 ----> prescaler = 10
CpuTimer1Regs.TPR.bit.TDDR = 9;
CpuTimer1Regs.PRD.all = 60; // 60 : 3000 nsec = 3 usec
CpuTimer1Regs.TCR.bit.TSS = 0; // start counting
}
void configureADC (void)
{
EALLOW;
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK = input clock/1
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK = input clock/1
AdccRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK = input clock/1
AdcdRegs.ADCCTL2.bit.PRESCALE = 6; // ADCCLK = input clock/1
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCC, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCD, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; //Interrupt pulse generation occurs at the end of the conversion
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; //Interrupt pulse generation occurs at the end of the conversion
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; //Interrupt pulse generation occurs at the end of the conversion
AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1; //Interrupt pulse generation occurs at the end of the conversion
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // power on ADCA
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; // power on ADCB
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; // power on ADCC
AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1; // power on ADCD
DELAY_US(1000); //////////////////////delay for 1ms to allow ADC time to power up
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2; // SOC0 will convert ADCINA2 - ADCINA3
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2; // SOC0 will convert ADCINB2
AdccRegs.ADCSOC0CTL.bit.CHSEL = 2; // SOC0 will convert ADCINC2
AdcdRegs.ADCSOC0CTL.bit.CHSEL = 2; // SOC0 will convert ADCIND2
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19; // acquisition window = 100 nsec
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19; // acquisition window = 100 nsec
AdccRegs.ADCSOC0CTL.bit.ACQPS = 19; // acquisition window = 100 nsec
AdcdRegs.ADCSOC0CTL.bit.ACQPS = 19; // acquisition window = 100 nsec
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 2;
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 2;
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 2;
AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 2;
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;//end of SOC0 will set ADCINT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//make sure INT1 flag is cleared
EDIS;
}
interrupt void adca1_isr (void)
{
//GpioDataRegs.GPATOGGLE.bit.GPIO22 = 1;
static unsigned int m = 0;
m++;
if(/*i <= 510 &&*/ Buf1Full == 'N' )
{
//m++;
Buf1[i++] = m;
Buf1[i++] = m>>8;
if(i == 512)
{
j=0;
Buf1Full = 'Y';
}
}
else if (/*j <= 510 &&*/ Buf2Full == 'N' )
{
//m++;
Buf2[j++] = m;
Buf2[j++] = m>>8;
if(j == 512)
{
i=0;
Buf2Full = 'Y';
}
}
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
توضیح کد :
دو تا بافر تعریف کردم که ابتدا اولی پر بشه و بعدش دومی توی حلقه while هم میاد چک میکنه که اگر بافر ها کامل پر شدن اون وقت شروع به نوشتن در داخل کارت SD میکنیم. الان همون طور که در ادامه عکسش رو گذاشتم یک سری از داده ها نوشته نمیشه و عملا مشکل داره . علتش هم فکر کنم این باشه که زمان نوشتن داخل کارت SD خیلی طولانی هست. چون متغیر m اضافه شده ولی داخل بافر ها نوشته نشده . میخواستم ببینم راه کاری برای رفع این مشکل هست یا نه ؟ توی این برنامه فرکانس نمونه برداری خیلی زیاده ولی وقتی کمش هم میکنم باز همین مشکل رو دارم. در واقع میخوام ببینم این الگوریتم خوبه یا اینکه الگوریتم رو باید عوض کرد . ممنون میشم راهنمایی کنید.
اینم از عکس محتویات کارت SD که اعداد ناگهانی پرش میکنند.
این رو هم اضافه کنم که علت شیفت به راست اعدا اینه که متغیر unsigned char در این سری از dsp هشت بیتی هست و برای نوشتن روی کارت SD باید 8 بیت بالا و پایین را توی دو تا خونه جداگانه نوشت.
خیلی ممنون.
دیدگاه