OpenEdv-开源电子网

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

STM32 F1 用ADC1 ,3通道采样,采样的12位数值是FFF

[复制链接]

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
发表于 2017-3-22 15:06:54 | 显示全部楼层 |阅读模式
5金钱
一个通道采样10次,采集到数据是 FFF FFF B56 FFF FFF B53 FFF FFF B4D FFF

求帮忙看看代码
[mw_shl_code=c,true]u16 AD_Vaule[3][10];     //DMA½ÓÊÕ»º´æ  3¸öÊýÖµ

#define ADC_DR_Address 0x4001244C  //ADC1 ÄÚ´æ»ùµØÖ·

#define  DMA1_MEM_LEN  sizeof(AD_Vaule)    // »º´æÆ÷µÄ´óС
void DMA_Configuration(void)
{
          DMA_InitTypeDef DMA_InitStructure;
               
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);   //DMA¹ÒÔÚAHB×ÜÏßÏ       
          DMA_DeInit(DMA1_Channel1);//½«DMA1 ͨµÀ1µÄÖµÉèÖÃΪȱʡֵ
          //ÐèÒªµÈ´ýDMA1ʱÖÓÎȶ¨
          __nop();
          __nop();
       
          DMA_InitStructure.DMA_BufferSize=30; //DMA»º´æÆ÷´óС
          DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;   //ÍâÉè×÷Ϊ»ùµØÖ·
          DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;       
          DMA_InitStructure.DMA_MemoryBaseAddr= (u32)AD_Vaule;   //ÄÚ´æ»ùµØÖ·
       
          DMA_InitStructure.DMA_MemoryDataSize= DMA_MemoryDataSize_HalfWord;  // °ë×Ö 16λ
          DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;  //ÄÚ´æµØÖ·ÔöÁ¿Ä£Ê½
       
          DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;  //Ñ­»·Ä£Ê½
          DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)(&ADC1->DR);   //ÍâÉè»ùµØÖ·
          DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord ; //°ë×Ö16λ
          DMA_InitStructure.DMA_PeripheralInc= DMA_PeripheralInc_Disable ;  //ÍâÉèµØÖ· ·ÇÔöÁ¿Ä£Ê½
          DMA_InitStructure.DMA_Priority= DMA_Priority_High;  //ÖеÈÓÅÏȼ¶Ä£Ê½          
    DMA_Init(DMA1_Channel1,&DMA_InitStructure);   //DMAͨµÀ
    DMA_Cmd(DMA1_Channel1,ENABLE);  //¿ªÆôDMA1ͨµÀ
               
}[/mw_shl_code]

[mw_shl_code=c,true]void ADC_INIT(void)  
{
                GPIO_InitTypeDef GPIO_InitStructure;
                ADC_InitTypeDef ADC_InitStructure;
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//³õʼ»¯GPIOA¡¢ADC1ʱÖÓ
                //ÉèÖ&#195A1ΪģÄâÊäÈë
//                RCC_ADCCLKConfig(RCC_PCLK2_Div6);
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;   //ÅäÖ&#195A0 PA1 PA2 PA3Ä£Äâ
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
                GPIO_Init(GPIOA,&GPIO_InitStructure);
                //ÅäÖÃADC1       
                //ÉèÖÃADC·ÖƵʱÖÓ£¬ADCʱÖÓ²»Äܳ¬¹ý14MHz
                ADC_DeInit(ADC1);
                //ÅäÖÃADC1²ÎÊý

   ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;                                  //ADCÁ¬ÐøÄ£Ê½¿ª
         ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;                              //12λÊý¾ÝÓÒ¶ÔÆë
         ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;                 //Íⲿ¿ªÆô¹Ø  ÓÉÈí¼þ¿ªÆô
         ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;                                  //ADC¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
         ADC_InitStructure.ADC_NbrOfChannel=3;                                             //¿ªÆôͨµÀÊýΪ1
         ADC_InitStructure.ADC_ScanConvMode=ENABLE;                                        //ɨÃèģʽ¹Ø
         ADC_Init(ADC1, &ADC_InitStructure);         
       
                ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5); //ÅäÖùæÔò×éͨµÀ£¬ÉèÖÃͨµÀµÄ˳Ðò£¬²ÉÑùʱ¼ä
    ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);
                ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);
                       
                ADC_Cmd(ADC1,ENABLE);
                ADC_DMACmd(ADC1,ENABLE);  //ʹÄÜADC1--DMAÇëÇó                       
                //¿ªÆôADCУ׼£¬±ØÐ뿪!
                ADC_ResetCalibration(ADC1);        //ʹÄܸ´Î»Ð£×¼                   
                while(ADC_GetResetCalibrationStatus(ADC1));        //µÈ´ý¸´Î»Ð£×¼½áÊø               
                ADC_StartCalibration(ADC1);         //¿ªÆôADУ׼         
                while(ADC_GetCalibrationStatus(ADC1));         //µÈ´ýУ׼½áÊø               

    ADC_SoftwareStartConvCmd(ADC1,ENABLE);  //Èí¼þת»»
   
}[/mw_shl_code][mw_shl_code=c,true]                while(1)
                {               
                        u8 t,i;
                        for(t=0;t<3;t++)
                        {
                                AD_Vaule_Average[t]=0;
                                for(i=0;i<10;i++)  //&#199;ó&#184;&#246;&#205;¨&#181;&#192;10&#180;&#206;&#181;&#196;&#198;&#189;&#190;ù&#214;&#181;
                                {
                                        AD_Vaule_Average[t]+=AD_Vaule[t];       
                                }
                                AD_Vaule_Average[t]/=10;
                 }                       
                        for(t=0;t<3;t++)  //&#210;&#192;&#180;&#206;&#207;&#212;&#202;&#190;
                        {                               
//                           printf("&#205;¨&#181;&#192;%d&#181;&#196;&#178;&#201;&#209;ù&#214;&#181;&#163;&#186;%d\r\n",t+1,AD_Vaule_Average[t]);
                                 adc[t]= AD_Vaule_Average[t];
         temp[t]=(float)adc[t]*(3.3/4096); //&#181;&#195;&#181;&#189;&#202;&#181;&#202;&#253;&#192;à&#208;&#205;&#178;&#201;&#209;ù&#214;&#181;
                                 adc2[t] =temp[t];               //&#181;&#195;&#181;&#189;&#213;&#251;&#202;&#253;&#178;&#191;·&#214;
                                 LCD_ShowxNum(130,80+t*20,adc2[t],1,RED,0);
                                 temp[t]-=adc2[t];  //&#208;&#161;&#202;&#253;&#178;&#191;·&#214;
         temp[t]*=1000;
         LCD_ShowxNum(149,80+t*20,temp[t],3,RED,0);                                
                        }
                        printf("\r\n");
                        delay_ms(200);[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

你理解错了,多通道DMA的数据是按 通道1 通道2 通道3 通道1 通道2 通道3 通道1 通道2 通道3这样的方式排列的。所以应该是u16 AD_Vaule[10][3].
亦余心之所善,
虽九死其犹未悔。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-22 15:06:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-3-22 20:20:00 | 显示全部楼层
论坛搜索,参考下别人代码
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-3-23 10:27:45 | 显示全部楼层
charlefu 发表于 2017-3-22 15:06
你理解错了,多通道DMA的数据是按 通道1 通道2 通道3 通道1 通道2 通道3 通道1 通道2 通道3这样的方式排列 ...

你说的对 ,修改之后的程序测量3.3V 0V电压时正确。
但是当管脚悬空时,悬空管脚的电压测量不正确。悬空管脚一般电压为1.5V左右,但当相邻管脚接地或接3.3V时,悬空管脚的电压会变化很大。
比如 PA0--3.3V  PA1悬空  PA1会测量2.3 2.4V   PA0-0V时 ,PA1悬空 PA1测量电压0.9V~1.2V

这是怎么情况
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-23 11:31:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-3-23 12:52:45 | 显示全部楼层
charlefu 发表于 2017-3-23 11:31
悬空的引脚是会收到旁边脚的干扰的。

干扰很大啊,好像没什么好办法去除
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 10:42:20 | 显示全部楼层
charlefu 发表于 2017-3-22 15:06
你理解错了,多通道DMA的数据是按 通道1 通道2 通道3 通道1 通道2 通道3 通道1 通道2 通道3这样的方式排列 ...

我有个疑问 为什么接收ADC数据的数组要定义为2维数组啊。直接定义为u16 的一维数组可以吗
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 10:45:09 | 显示全部楼层
charlefu 发表于 2017-3-22 15:06
你理解错了,多通道DMA的数据是按 通道1 通道2 通道3 通道1 通道2 通道3 通道1 通道2 通道3这样的方式排列 ...

我还有各疑问 就是我用ADC1检测两路电压,用DMA的方式传输到一个数组当中,感觉测试出来的结果很不准。 不知道这是为啥 大兄弟能给我解释解释一下嘛
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-24 11:35:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-24 11:40:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 13:55:16 | 显示全部楼层
charlefu 发表于 2017-3-24 11:35
ADC不准还是不稳?这是两个概念。你的情况需要描述具体点。

即不稳也不准 ,同样的电压 我用万用表测出来的话就2.几V 但是用ADC1测试出来的数据居然有10几V  而且还不稳 我用串口把数据打印出来 低的有0.几V
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 14:08:34 | 显示全部楼层
charlefu 发表于 2017-3-24 11:35
ADC不准还是不稳?这是两个概念。你的情况需要描述具体点。

1.267V 0.267V 14.400V 16.867V 16.400V 15.600V 16.867V
16.467V 0.667V
extern u16 ADC1_DATA[30];                //这个数组用于获取ADC1中的数据  
float My_WaterCheck(float level,u8 ch)    //@level表示水位关机的阈值 @ch表示ADC1的通道
{
//        extern u8 flag;
        float WaterCheckVal,WaterVolt;
//        float ADC1CH1;
//       
//        ADC1CH1=My_Get_ADC_AVERAGEVAL(ADC_Channel_1,10);
//        printf("\r\nADC1CH1通道的值为:%fV",(ADC1CH1*3.3/4096));
//        delay_ms(10);    //加这个延时是为了给ADC1留一个转换时间
         
          delay_ms(10);
        WaterCheckVal=My_Get_ADC_AVERAGEVAL(ch,10);
        WaterVolt=(float)WaterCheckVal*3.3/4096;
//        if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET)//判断通道 1 传输完成
//        {
//                printf("\r\nADC1CH6通道的值为:%1.3fV",(float)(ADC1_DATA[0]*3.3/4096));
//          WaterVolt=(float)((ADC1_DATA[1]<<4)*3.3/4096);               
    delay_ms(100);
//                WaterVolt=Count_Average(15);
          if(WaterVolt<level)
           {
                   My_PowerOff(1);     //@1 表示水位检测关机
           }
           DMA_ClearFlag(DMA1_FLAG_TC1);//清除通道 1 传输完成标志
//        }
          
           return WaterVolt;
               
}

float Count_Average(u8 time)
{
        u8 count;
        float WaterVoltAverage=0;
        for(count=0;count<time;count++)
        {
                WaterVoltAverage=+(ADC1_DATA[2*count+1]);
        }
        WaterVoltAverage=(float)WaterVoltAverage/15;
        return WaterVoltAverage;
}
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 14:10:50 | 显示全部楼层
charlefu 发表于 2017-3-24 11:40
当然可以定义成1维的,定义成2维的话访问某一路的数据就可以直接用数组的第一维进行访问。各人有各人的习 ...

3.299V 3.299V 3.299V 3.299V 1.741V 2.049V 2.025V
2.019V 2.024V 2.071V 2.062V 2.071V 2.054V
2.012V 2.032V 2.139V 2.086V 2.089V 2.074V
2.078V 2.062V 2.065V 2.058V 2.097V 2.133V
2.085V 2.086V 2.075V 2.134V 2.065V 2.061V
2.104V 2.109V 2.059V 2.089V 2.075V  这组数据是没有使用ADC_DMA测试的道德数据 这组数据比较准确  上面哪一组很大的数据就是使用DMA得到的数据
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-24 15:26:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 15:44:20 | 显示全部楼层
本帖最后由 坏坏62 于 2017-3-24 15:45 编辑
charlefu 发表于 2017-3-24 15:26
看上去是DMA使用有错误。

void My_DMA1_Init(u8 channel,DMA_Channel_TypeDef*dmach,u32 cpar,u32 cmar,u16 lens)    //@channel 1-7 表示初始化DMA的那个通道
{
        
        
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
        DMA_MAX_LENS=lens;
        
        switch(channel)
        {
                case 1:
                {
                          DMA_DeInit(dmach);   //复位DMA
                          DMA_InitStructure.DMA_BufferSize=DMA_MAX_LENS;               
                                DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;                    
                                DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
                                DMA_InitStructure.DMA_MemoryBaseAddr=cmar;
                                DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;     
                                DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
                                DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
                                DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;
                                DMA_InitStructure.DMA_PeripheralDataSize=DMA_MemoryDataSize_HalfWord;
                                DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
                                DMA_InitStructure.DMA_Priority=DMA_Priority_High;
                                DMA_Init(DMA1_Channel1,&DMA_InitStructure);
                                printf("\r\nDMA1CH1初始化函数执行完毕");        
//                          DMA_Cmd(DMA1_Channel1,ENABLE);
                          break;
                }
                case 2:
                {
                        
                        break;
                        
                }
                case 4:
                        {
                                DMA_DeInit(dmach);   //复位DMA
                                DMA_InitStructure.DMA_BufferSize=DMA_MAX_LENS;               
                                DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;                    
                                DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
                                DMA_InitStructure.DMA_MemoryBaseAddr=cmar;
                                DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
                                DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
                                DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
                                DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;
                                DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
                                DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
                                DMA_InitStructure.DMA_Priority=DMA_Priority_High;
                                DMA_Init(DMA1_Channel4,&DMA_InitStructure);
                                printf("\r\nDMA1CH4初始化函数执行完毕");
                                break;
                                
                        }
                default:
                        break;        
        }
        
        
        
        
        
}        
        



void My_DMA1_Enable(DMA_Channel_TypeDef*dmach)              //这个函数的主要功能就是打开DMA的使能位
{
        
//        printf("\r\n程序进入DMA使能函数\r\n");
        DMA_Cmd(dmach,DISABLE);
        DMA_SetCurrDataCounter(dmach,DMA_MAX_LENS);
        DMA_Cmd(dmach,ENABLE);        
        delay_ms(10);
}
这是初始化函数
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 15:47:42 | 显示全部楼层
charlefu 发表于 2017-3-24 15:26
看上去是DMA使用有错误。

但是使用有错误的话  ADC中的数据应该传不过来才对啊 那数组当中存放的值为0才对的吧 可是现在是数据不正确 我这点不太明白  能否给我解释一下啊
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-24 18:32:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-24 18:59:14 | 显示全部楼层
本帖最后由 坏坏62 于 2017-3-24 19:05 编辑
charlefu 发表于 2017-3-24 18:32
你adc的代码呢?是多通道吗?

void My_ADC_Init(void)
{
        
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);   //使能时钟  毋容置疑的第一步
        
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;            //初始化GPIOA的工作模式  配置为模拟输入
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);     
        
        
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //配置ADC的时钟
        ADC_DeInit(ADC1);                     //ADC复位
        
        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;            //开启连续模式
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;

        ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
        ADC_InitStructure.ADC_NbrOfChannel=2;                         //顺序进行转换的通道数目
        ADC_InitStructure.ADC_ScanConvMode=ENABLE;                    //开始扫描模式
        ADC_Init(ADC1,&ADC_InitStructure);                       //ADC初始化

  

  ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1,ADC_Channel_6,2,ADC_SampleTime_239Cycles5);   //
        
        
        

      
        
        
        ADC_Cmd(ADC1,ENABLE);                      //使能ADC1
  
        ADC_ResetCalibration(ADC1);  
        while(ADC_GetResetCalibrationStatus(ADC1));
        
        ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));    //ADC的自动校准

        printf("\r\nADC初始化完成\r\n");
  delay_ms(5);        
        
}


u16 My_Get_ADC_VAL(u16 ch)
{
   ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); //这句话的意思是设置采样时间和采样间隔

          ADC_SoftwareStartConvCmd(ADC1,ENABLE);   
        delay_ms(2);
        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))
        {
               
        }
        

        return ADC_GetConversionValue(ADC1);
               

}





u16 My_Get_ADC_AVERAGEVAL(u16 ch,u8 times)
{
        u8 count;

        u16 ADCVAL=0;
        

        for(count=0;count<times;count++)
        {
                ADCVAL+=My_Get_ADC_VAL(ch);
                delay_ms(5);

        }
        ADCVAL=ADCVAL/10;

就两个通道
回复

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-2
在线时间
67 小时
发表于 2017-4-4 17:13:14 | 显示全部楼层
坏坏62 发表于 2017-3-24 18:59
void My_ADC_Init(void)
{
        

你能分享下主函数调用部分吗,我对于多通道连续扫描有些疑惑,两个通道每次转换后的值是怎么被记录下来的
还请赐教
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-4-4 18:23:45 | 显示全部楼层
企鹅在挠痒 发表于 2017-4-4 17:13
你能分享下主函数调用部分吗,我对于多通道连续扫描有些疑惑,两个通道每次转换后的值是怎么被记录下来的 ...

你是说ADC的DMA是吧  其实是这样的,你配置ADC为多通道连续扫描模式之后然后打开DMA功能之后,ADC一次只能将一个通道的转换结果存在DR寄存器中,当一个通道转换结束之后呢,DMA会自动将ADC数据寄存器中的转换值通过硬件自动复制到你设置的内存中去,就这样一个通道一个通道的转换复制转换复制,其中DMA的工作方式是需要自己设置的。具体可以 看原子哥的代码
回复

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-2
在线时间
67 小时
发表于 2017-4-4 18:29:34 | 显示全部楼层
坏坏62 发表于 2017-4-4 18:23
你是说ADC的DMA是吧  其实是这样的,你配置ADC为多通道连续扫描模式之后然后打开DMA功能之后,ADC一次只 ...

我说的是非DMA情况,针对你在十八楼贴的代码。
原子哥ADC例程是单通道,使用了一个Get_Adc(u8 ch) 函数
当改为多通道时 不知道如何读取
回复

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-2
在线时间
67 小时
发表于 2017-4-5 13:07:25 | 显示全部楼层
坏坏62 发表于 2017-4-4 18:23
你是说ADC的DMA是吧  其实是这样的,你配置ADC为多通道连续扫描模式之后然后打开DMA功能之后,ADC一次只 ...

第一次翻stm32官方的参考手册,在里面找到了答案。非DMA方式的多通道ADC转换可以进行多次采集,每次只采集一路

STM32参考手册截图

STM32参考手册截图
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-4-5 14:15:42 | 显示全部楼层
企鹅在挠痒 发表于 2017-4-5 13:07
第一次翻stm32官方的参考手册,在里面找到了答案。非DMA方式的多通道ADC转换可以进行多次采集,每次只采 ...

这个问题我之前也想过 但是一想到有DMA的功能就没想过用非DMA的方法去实现 谢谢大兄弟了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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