本帖最后由 tiercel 于 2014-8-2 15:45 编辑
这是ADC-to-LCD的一个程序,是psoc creator里面的示例程序。把AD转换的结果送LCD显示之前有一大堆对转换结果的处理,我看不太懂,但是我把那部分程序删除后,下载到板子上结果没变化,请哪位大神帮我看一下
这是原来的程序:红色部分是看不懂的那部分 #include <device.h> #include "stdio.h" #include "math.h"
/* Number of samples to be taken before averaging the ADCvalue */ #define MAX_SAMPLE ((uint8)128)
/* Threshold value to reset the filter for sharp changein signal */ #define SIGNAL_SLOPE 1000
/* Number of shifts for calculating the sum and averageof MAX_SAMPLE */ #define DIV 7
int main(void) { uint8 i; /* Array tostore ADC count for moving average filter */ int32 adcCounts[MAX_SAMPLE] = {0}; /* Variable to hold ADCconversion result */ int32 result = 0; /* Variable to store accumulatedsample for filter array */ int32 sum = 0; /* Variable for testing sharpchange in signal slope */ int16 diff = 0; /* Variable to hold the result in microvolts converted from filtered * ADC counts */ int32 microVolts = 0; /* Variable to hold the movingaverage filtered value */ int32 averageCounts = 0; /* Index variable to work on the filterarray */ uint8 index = 0; /* Characterarray to hold the micro volts*/ char displayStr[15] = {'\0'};
CYGlobalIntEnable;
/* Start ADC and start conversion */ ADC_Start(); ADC_StartConvert();
/* Start LCD and set position */ LCD_Start(); LCD_Position(0,0); LCD_PrintString("ADC inputvolt");
/* Print μV unit on the LCD */ LCD_Position(1,8); LCD_WriteData(0xE4); LCD_PutChar('V'); /* Read one sample from the ADCand initialize the filter */ ADC_IsEndConversion(ADC_WAIT_FOR_RESULT); result = ADC_GetResult32(); for(i = 0; i < MAX_SAMPLE;i++) { adcCounts = result; } /* Store sum of128 samples*/ sum = result << DIV; /* Average countis equal to one single sample for first ADC reading */ averageCounts = result; while(1) { ADC_IsEndConversion(ADC_WAIT_FOR_RESULT); result = ADC_GetResult32(); diff = abs(averageCounts -result); /* Ifsharp change in the signal then reset the filter with the new * signal value */ if(diff > SIGNAL_SLOPE) { for(i = 0; i< MAX_SAMPLE; i++) { adcCounts = result; } /*Store sum of 128 samples*/ sum = result<< DIV; /* Averagecount is equal to new sample */ averageCounts =result; index = 0; } /* Get moving average */ else { /* Remove theoldest element and add new sample to sum and get * theaverage */ sum = sum -adcCounts[index]; sum = sum +result; averageCounts =sum >> DIV; /* Removethe oldest sample and store new sample */ adcCounts[index] = result; index++; if (index ==MAX_SAMPLE) { index = 0; } } microVolts =ADC_CountsTo_uVolts(averageCounts); /*Convert micro volts to string and display on the LCD */ sprintf(displayStr,"%7ld",microVolts); LCD_Position(1,0); LCD_PrintString(displayStr); } } 这是修改后的程序 #include <device.h> #include "stdio.h" void main() { /* Variable to hold ADC conversionresult */ int32 result = 0; /* Variable to hold the result in microvolts converted from filtered * ADC counts */ int32 microVolts = 0; /* Character array to hold the microvolts*/ char displayStr[15] = {'\0'}; /* Start ADC and startconversion */ ADC_Start(); ADC_StartConvert(); /* Start LCD andset position */ LCD_Start(); LCD_Position(0,0); LCD_PrintString("ADC inputvolt"); /* Print μV unit on the LCD */ LCD_Position(1,8); LCD_WriteData(0xE4); LCD_PutChar('V'); /* Read one sample from the ADC andinitialize the filter */ ADC_IsEndConversion(ADC_WAIT_FOR_RESULT); result = ADC_GetResult32(); microVolts =ADC_CountsTo_uVolts(result); sprintf(displayStr,"%7ld",microVolts); LCD_Position(1,0); LCD_PrintString(displayStr); } |