微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32双ad采集

stm32双ad采集

时间:10-02 整理:3721RD 点击:
想利用C1C4端口采集两路ad值,但是第二路一直失败,请教各位
#include <ccd.h>
#define ADC1_DR_Address    ((u32)0x40012400+0x4c)
unsigned char ad[128];//2é?ˉμ?μ?128??μ?ad?μ
unsigned char ad_[43];//·???′|àíoóμ?43????óòad
unsigned char ad_cl[43];//43????óò?t?μ?ˉoóêy?Y
unsigned char min_ad,max_ad,fa;//ad×?′ó?μ£?×?D??μ,·§?μ
int i;
char ss1=0,n1=0,ss2=0,n2=0;
#define si1 GPIO_Pin_3
#define clk1 GPIO_Pin_2
#define si2 GPIO_Pin_4
#define clk2 GPIO_Pin_5
__IO uint32_t ADC_ConvertedValue[2];
//__IO u16 ADC_ConvertedValueLocal;
void SamplingDelay(void)
{
        int i=60;
        while(i--){}
}
void ccd_IOint_1(){
                GPIO_InitTypeDef GPIO_Struct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        GPIO_Struct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2; //CCD1μ?si ,clk???ú C3 C2
        GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP  ;
        GPIO_Init(GPIOC,&GPIO_Struct);
       
}
void ccd_IOint_2(){
                GPIO_InitTypeDef GPIO_Struct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_Struct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5; //CCD2μ?si ,clk???úA4 A5
        GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP  ;
        GPIO_Init(GPIOA,&GPIO_Struct);
}
void ADC1_GPIO_Config(void)//           CCDμ?AD???ú????
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* Enable DMA clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        /* Enable ADC1 and GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
       
        /* Configure PC.0  as analog input */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOC, &GPIO_InitStructure);                        //ccd1μ?AD2é?ˉ PC1,ê?è?ê±2?ó?éè???ù?ê
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOC, &GPIO_InitStructure);                        // ccd2μ?AD2é?ˉPC4,ê?è?ê±2?ó?éè???ù?ê
}
/**
  * @brief  ????ADC1μ?1¤×÷?£ê??aMDA?£ê?
  * @param  ?T
  * @retval ?T
  */
void ADC1_Mode_Config(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
       
        /* DMA channel1 configuration */
        DMA_DeInit(DMA1_Channel1);
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                                 //ADCμ??·
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //?ú′?μ??·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 2;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //íaéèμ??·1ì?¨
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                  //?ú′?μ??·μY??
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        //°?×?
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                                //?-?·′?ê?
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        /* Enable DMA channel1 */
        DMA_Cmd(DMA1_Channel1, ENABLE);
        /* ADC1 configuration */       
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                        //?àá¢ADC?£ê?
        ADC_InitStructure.ADC_ScanConvMode = ENABLE ;                                          //?a??é¨?è?£ê?
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                        //?a??á?D?×a???£ê?£??′2?í£μ???DDADC×a??
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //2?ê1ó?ía2?′¥·¢×a??
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         //2é?ˉêy?Yóò????
        ADC_InitStructure.ADC_NbrOfChannel = 2;                                                                         //òa×a??μ?í¨μàêy??2
        ADC_Init(ADC1, &ADC_InitStructure);
       
        /*????ADCê±?ó£??aPCLK2μ?8·??μ£??′9MHz*/
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
        /*????ADC1μ?í¨μà11?a55.        5??2é?ù?ü?ú£?DòáD?a1 */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);       
        ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_239Cycles5);
        /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);
       
        /* Enable ADC1 */
        ADC_Cmd(ADC1, ENABLE);
       
        /*?′??D£×???′??÷ */   
        ADC_ResetCalibration(ADC1);
        /*μè′yD£×???′??÷?′??íê3é */
//        while(ADC_GetResetCalibrationStatus(ADC1));
       
        /* ADCD£×? */
        ADC_StartCalibration(ADC1);
//        /* μè′yD£×?íê3é*/
while(ADC_GetCalibrationStatus(ADC1));
//       
        /* óéóú??óD2éó?ía2?′¥·¢£??ùò?ê1ó?èí?t′¥·¢ADC×a?? */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

u16 ADC_Get_Value_1(void)//?áè?AD×a??oóμ?êy?μ
{
         u32 a1=0;
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
        while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET){}
        a1=ADC_ConvertedValue[0];       
        return a1;
}
u16 ADC_Get_Value_2(void)//?áè?AD×a??oóμ?êy?μ
{
         u32 a2=0;
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
        while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET){}
        a2=ADC_ConvertedValue[1];       
        return a2;
}
void ADC1_Init(void)
{
        ADC1_GPIO_Config();
        ADC1_Mode_Config();
}
void ccd_int()
{
        ccd_IOint_1();
        ccd_IOint_2();
        ADC1_Init();
}
void ccd_1()
{ char ss1=0,n1=0,ss2=0,n2=0;
                GPIO_SetBits(GPIOC,si1);              /* SI  = 1 */
    SamplingDelay();
                GPIO_SetBits(GPIOC,clk1);
                SamplingDelay();
                GPIO_ResetBits(GPIOC,si1);                               /* SI  = 0 */
                SamplingDelay();
                SamplingDelay();
                GPIO_ResetBits(GPIOC,clk1);
                for(i=0; i<128; i++)
                {
                        SamplingDelay();
                        GPIO_SetBits(GPIOC,clk1);                        /* CLK = 1 */
                        SamplingDelay();
                        SamplingDelay();
                        ad[i] = (u8)(ADC_Get_Value_1()>>4);
                        GPIO_ResetBits(GPIOC,clk1);                      /* CLK = 0 */
                }
                SamplingDelay();
    GPIO_SetBits(GPIOC,clk1);                    /* CLK = 1 */
                SamplingDelay();                                                                                                 
    GPIO_ResetBits(GPIOC,clk1);           /* CLK = 0 */
                ad_[42]=(ad[126]+ad[127])/2;
                for(i=0;i<42;i++)                                                                                 //o?2¢????μ?
                {
                        ad_[i]=(ad[3*i]+ad[3*i+1]+ad[3*i+2])/3;
                }
                 max_ad =ad[0];
     min_ad =ad[0];       
                 for(i=0;i<42;i++)
    {
      if (ad_[i] > max_ad) max_ad =ad_[i];
      if (ad_[i] < min_ad) min_ad =ad_[i];
    }
        fa = (max_ad + min_ad)*0.5;   
//    for(i=0;i<128;i++)
//                                                { if(ad[i] > fa){ ss1=ss1+ad[i];n1++;}
//                    else        {                ss2=ss2+ad[i];n2++;                }               
//                                                }
//                                                ss1=ss1/n1;
//                                                ss2=ss2/n2;
//                                                fa=(ss1+ss2)/2;
                                                for(i=0;i<128;i++)
                                                { if(ad[i] > fa&&ad[i]-fa>fa*0.35){ ad[i]=1;}
                    else        {                ad[i]=0;        }               
                                                }
                                                  for(i=0;i<43;i++)
                                                { if(ad_[i] > fa&&ad_[i]-fa>fa*0.35) ad_cl[i]=1;
                    else                ad_cl[i]=0;                                       
                                                }
                       

                        
}
void ccd_2()
{ char ss1=0,n1=0,ss2=0,n2=0;
                GPIO_SetBits(GPIOA,si2);              /* SI  = 1 */
    SamplingDelay();
                GPIO_SetBits(GPIOA,clk2);
                SamplingDelay();
                GPIO_ResetBits(GPIOA,si2);                               /* SI  = 0 */
                SamplingDelay();
                SamplingDelay();
                GPIO_ResetBits(GPIOA,clk2);
                for(i=0; i<128; i++)
                {
                        SamplingDelay();
                        GPIO_SetBits(GPIOA,clk2);                        /* CLK = 1 */
                        SamplingDelay();
                        SamplingDelay();
                        ad[i] = (u8)(ADC_Get_Value_2()>>4);
                        GPIO_ResetBits(GPIOA,clk2);                      /* CLK = 0 */
                }
                SamplingDelay();
    GPIO_SetBits(GPIOA,clk2);                    /* CLK = 1 */
                SamplingDelay();                                                                                                 
    GPIO_ResetBits(GPIOA,clk2);           /* CLK = 0 */
                ad_[42]=(ad[126]+ad[127])/2;
                for(i=0;i<42;i++)                                                                                 //o?2¢????μ?
                {
                        ad_[i]=(ad[3*i]+ad[3*i+1]+ad[3*i+2])/3;
                }
                 max_ad =ad[0];
     min_ad =ad[0];       
                 for(i=0;i<42;i++)
    {
      if (ad_[i] > max_ad) max_ad =ad_[i];
      if (ad_[i] < min_ad) min_ad =ad_[i];
    }
        fa = (max_ad + min_ad)*0.5;   
//    for(i=0;i<128;i++)
//                                                { if(ad[i] > fa){ ss1=ss1+ad[i];n1++;}
//                    else        {                ss2=ss2+ad[i];n2++;                }               
//                                                }
//                                                ss1=ss1/n1;
//                                                ss2=ss2/n2;
//                                                fa=(ss1+ss2)/2;
                                                for(i=0;i<128;i++)
                                                { if(ad[i] > fa&&ad[i]-fa>fa*0.35){ ad[i]=1;}
                    else        {                ad[i]=0;        }               
                                                }
                                                  for(i=0;i<43;i++)
                                                { if(ad_[i] > fa&&ad_[i]-fa>fa*0.35) ad_cl[i]=1;
                    else                ad_cl[i]=0;                                       
                                                }
                       
                                        }      

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top