OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2837|回复: 2

战舰miniadc多通道,其中一通道的值一直封顶,其进行ad采样时采样值错误,另,相邻两引脚采样互相影响,求大能帮忙

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-15
在线时间
4 小时
发表于 2016-7-21 21:35:02 | 显示全部楼层 |阅读模式
ADC1ConvertedVoltage[0] = 0;
            ADC1ConvertedVoltage[1] = 0;
            ADC1ConvertedVoltage[2] = 0;
            ADC1ConvertedVoltage[3] = 0;
            for(i=0;i<4;i++)
            {
                for(j=0;j<64;j++)
                {
                    ADC1ConvertedVoltage[i] += ADC1ConvertedValue[j][i];
                }            
            ADC1ConvertedVoltage[i] = ADC1ConvertedVoltage[i]/64;
            }
            temp1 = ADC1ConvertedVoltage[0]*3.0/4096;
            temp2 = ADC1ConvertedVoltage[1]*3.0/4096;
            temp3 = ADC1ConvertedVoltage[2]*3.0/4096;
            temp4 = ADC1ConvertedVoltage[3]*3.0/4096;
            adcx=temp1;
                        LCD_ShowxNum(124,110,temp1,1,16,0);             //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μ&#213;&#251;êy2&#191;·&#214;
                        temp1-=adcx;
                        temp1*=1000;
                        LCD_ShowxNum(140,110,temp1,3,16,0X80);         //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μμ&#196;D&#161;êy2&#191;·&#214;
                       
            adcx=temp2;
                        LCD_ShowxNum(124,130,temp2,1,16,0);             //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μ&#213;&#251;êy2&#191;·&#214;
                        temp2-=adcx;
                        temp2*=1000;
                        LCD_ShowxNum(140,130,temp2,3,16,0X80);         //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μμ&#196;D&#161;êy2&#191;·&#214;

            adcx=temp3;
                        LCD_ShowxNum(124,150,temp3,1,16,0);             //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μ&#213;&#251;êy2&#191;·&#214;
                        temp3-=adcx;
                        temp3*=1000;
                        LCD_ShowxNum(140,150,temp3,3,16,0X80);         //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μμ&#196;D&#161;êy2&#191;·&#214;

            adcx=temp4;
                        LCD_ShowxNum(124,170,temp4,1,16,0);             //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μ&#213;&#251;êy2&#191;·&#214;
                        temp4-=adcx;
                        temp4*=1000;
                        LCD_ShowxNum(140,170,temp4,3,16,0X80);         //&#207;&#212;ê&#190;μ&#231;&#209;1&#214;μμ&#196;D&#161;êy2&#191;·&#214;
这是adc值提取后的运算程序
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //ê1&#196;üADC1í¨μàê±&#214;ó


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //éè&#214;&#195;ADC·&#214;&#198;μòò×ó6 72M/6=12,ADC×&#238;′óê±&#188;&#228;2&#187;&#196;ü3&#172;1y14M

    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1&#184;′&#206;&#187;
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //&#184;′&#206;&#187;&#189;áê&#248;         

        //PA1 ×÷&#206;a&#196;£&#196;aí¨μàê&#228;è&#235;òy&#189;&#197;                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //&#196;£&#196;aê&#228;è&#235;òy&#189;&#197;

    GPIO_Init(GPIOA, &GPIO_InitStructure);       

//        ADC_DeInit(ADC1);  //&#184;′&#206;&#187;ADC1,&#189;&#171;íaéè ADC1 μ&#196;è&#171;2&#191;&#188;&#196;′&#230;&#198;÷&#214;&#216;éè&#206;aè±ê&#161;&#214;μ

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC1¤×÷&#196;£ê&#189;:ADC1oíADC21¤×÷&#212;ú&#182;àá¢&#196;£ê&#189;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //&#196;£êy×a&#187;&#187;1¤×÷&#212;úμ¥í¨μà&#196;£ê&#189;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //&#196;£êy×a&#187;&#187;1¤×÷&#212;úμ¥′&#206;×a&#187;&#187;&#196;£ê&#189;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //×a&#187;&#187;óéèí&#188;t&#182;&#248;2&#187;ê&#199;ía2&#191;′¥·¢&#198;&#244;&#182;ˉ
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADCêy&#190;Yóò&#182;&#212;&#198;&#235;
        ADC_InitStructure.ADC_NbrOfChannel = 4;        //&#203;3Dò&#189;&#248;DD1&#230;&#212;ò×a&#187;&#187;μ&#196;ADCí¨μàμ&#196;êy&#196;&#191;
        ADC_Init(ADC1, &ADC_InitStructure);        //&#184;ù&#190;YADC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèADCxμ&#196;&#188;&#196;′&#230;&#198;÷   

    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_239Cycles5);

    //ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

    ADC_DMACmd(ADC1, ENABLE);

        ADC_Cmd(ADC1, ENABLE);        //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1
       
        ADC_ResetCalibration(ADC1);        //ê1&#196;ü&#184;′&#206;&#187;D£×&#188;  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //μè′y&#184;′&#206;&#187;D£×&#188;&#189;áê&#248;
       
        ADC_StartCalibration(ADC1);         //&#191;a&#198;&#244;ADD£×&#188;

        while(ADC_GetCalibrationStatus(ADC1));         //μè′yD£×&#188;&#189;áê&#248;
adc初始化
MYDMA_Config(DMA1_Channel1,(u32)ADC1_DR_Address,(u32)&ADC1ConvertedValue,256);//DMA1í¨μà1,íaéè&#206;aadc&#188;&#196;′&#230;&#198;÷,′&#230;′¢&#198;÷ADC1ConvertedValueêy×é,3¤256.
dma初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );          //ê1&#196;üDACí¨μàê±&#214;ó

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 // &#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  //&#196;£&#196;aê&#228;è&#235;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_4)        ;//PA.4 ê&#228;3&#246;&#184;&#223;
                                       
        DAC_InitType.DAC_Trigger=DAC_Trigger_None;        //2&#187;ê1ó&#195;′¥·¢1|&#196;ü TEN1=0
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//2&#187;ê1ó&#195;2¨D&#206;·¢éú
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//&#198;á±&#206;&#161;¢·ù&#214;μéè&#214;&#195;
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1ê&#228;3&#246;&#187;o′&#230;1&#216;±&#213; BOFF1=1
  DAC_Init(DAC_Channel_1,&DAC_InitType);         //3&#245;ê&#188;&#187;ˉDACí¨μà1

        DAC_Cmd(DAC_Channel_1, ENABLE);  //ê1&#196;üDAC2

  DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y&#184;&#241;ê&#189;éè&#214;&#195;DAC&#214;μ
DAC初始化
DAC_SetChannel1Data(DAC_Align_12b_R, 0);
    DMA_Cmd(DMA1_Channel1, ENABLE);      //&#198;&#244;&#182;ˉDMAí¨μà  
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);          //èí&#188;t&#198;&#244;&#182;ˉAD×a&#187;&#187;   
注释:adc的4号通道和dac共用一个引脚

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-15
在线时间
4 小时
 楼主| 发表于 2016-7-21 21:38:18 | 显示全部楼层
这是程序

多通道ADC.rar

3.13 MB, 下载次数: 32

回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2016-7-15
在线时间
88 小时
发表于 2016-7-22 08:25:13 | 显示全部楼层
与资源,加收藏
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 13:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表