OpenEdv-开源电子网

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

关于stm32F103ADC采集正弦电压和电流的问题

[复制链接]

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-12-13
在线时间
10 小时
发表于 2019-8-7 14:48:18 | 显示全部楼层 |阅读模式
1金钱
本人刚接触stm32的学习想问一下大家 如果stm32F103ADC同时采集正弦电压和电流,需要同时开启ADC1和ADC2吗?还是开启ADC1的两个通道就可以做到,下面是写的ADC部分的代码 期待批评指正!
void ADCx_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure; //¶¨òå½á11ìå±äá¿       
        ADC_InitTypeDef  ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);       
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//éèÖÃADC·ÖÆμòò×ó6 72M/6=12,ADC×î′óê±¼ä2»Äü3¬1y14M
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&ADC1->DR;
        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;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;      
        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);
        DMA_Cmd(DMA1_Channel1, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //Ä£Äaêäèë
        //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //Ä£Äaêäèë
        //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);       

        ADC_DeInit(ADC1);//?? ADC1,?? ADC1,
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;//é¨Ãèģ꽠      
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿aÆôá¬Dø×a»»
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//½ûÖ1′¥·¢¼ì2a£¬ê1óÃèí¼t′¥·¢
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò¶ÔÆë       
        ADC_InitStructure.ADC_NbrOfChannel = 2;//1¸ö×a»»Ôú1æÔòDòáDÖD ò2¾íêÇÖ»×a»»1æÔòDòáD1
         ADC_Init(ADC1, &ADC_InitStructure);//ADC3õê¼»ˉ
       
        ADC_DMACmd(ADC1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);//¿aÆôAD×a»»Æ÷
       
        ADC_ResetCalibration(ADC1);//ÖØÖÃÖ¸¶¨μÄADCμÄD£×¼¼Ä′æÆ÷
        while(ADC_GetResetCalibrationStatus(ADC1));//»ñè¡ADCÖØÖÃD£×¼¼Ä′æÆ÷μÄ×′ì¬
       
        ADC_StartCalibration(ADC1);//¿aê¼Ö¸¶¨ADCμÄD£×¼×′ì¬
        while(ADC_GetCalibrationStatus(ADC1));//»ñè¡Ö¸¶¨ADCμÄD£×¼3ìDò

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ê1Äü»òÕßê§ÄüÖ¸¶¨μÄADCμÄèí¼t×a»»Æô¶ˉ1|Äü
}

/*******************************************************************************
* oˉ êy Ãû         : Get_ADC_Value
* oˉêy1|Äü                   : »ñè¡í¨μàchμÄ×a»»Ö죬è¡times′Î,è»o󯽾ù        
* êä    èë         : ch:í¨μà±àoÅ
                                         times:»ñè¡′Îêy
* êä    3ö         : í¨μàchμÄtimes′Î×a»»½á1ûƽ¾ùÖμ
*******************************************************************************/
u16 Get_ADC_Value(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        //éèÖÃÖ¸¶¨ADCμÄ1æÔò×éí¨μ࣬ò»¸öDòáD£¬2éÑùê±¼ä
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADCí¨μà,239.5¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è                            
       
        for(t=0;t<times;t++)
        {
                //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1μ&#196;èí&#188;t×a&#187;&#187;&#198;&#244;&#182;ˉ1|&#196;ü       
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a&#187;&#187;&#189;áê&#248;
                //temp_val+=ADC_GetConversionValue(ADC1);
                temp_val+=ADC_ConvertedValue[0];
                delay_ms(5);
        }
        return temp_val/times;
}
u16 Get_ADC1_Value(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        //éè&#214;&#195;&#214;&#184;&#182;¨ADCμ&#196;1&#230;&#212;ò×éí¨μà£&#172;ò&#187;&#184;&#246;DòáD£&#172;2é&#209;ùê±&#188;&#228;
        ADC_RegularChannelConfig(ADC1, ch, 2, ADC_SampleTime_239Cycles5);        //ADC1,ADCí¨μà,239.5&#184;&#246;&#214;ü&#198;ú,ìá&#184;&#223;2é&#209;ùê±&#188;&#228;&#191;éò&#212;ìá&#184;&#223;&#190;&#171;è·&#182;è                            
       
        for(t=0;t<times;t++)
        {
                //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1μ&#196;èí&#188;t×a&#187;&#187;&#198;&#244;&#182;ˉ1|&#196;ü       
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a&#187;&#187;&#189;áê&#248;
                //temp_val+=ADC_GetConversionValue(ADC1);
                temp_val+=ADC_ConvertedValue[1];
                delay_ms(5);
        }
        return temp_val/times;
}


最佳答案

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

使用DR寄存器地址做外设基地址 不需要递增的 DMA_PeripheralInc_Disable这个就行了 测电压的话 一个ADC够了即可
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14422
金钱
14422
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-8-7 14:48:19 | 显示全部楼层
谈龙照 发表于 2019-8-7 15:32
还有一个问题我这边选用外设作为原地址 是不是该使能DMA_PeripheralInc_ENABLE 我这里是不是有问题

使用DR寄存器地址做外设基地址 不需要递增的 DMA_PeripheralInc_Disable这个就行了  测电压的话 一个ADC够了即可
啊哈~加油!!
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-12-13
在线时间
10 小时
 楼主| 发表于 2019-8-7 15:32:45 | 显示全部楼层
还有一个问题我这边选用外设作为原地址 是不是该使能DMA_PeripheralInc_ENABLE 我这里是不是有问题
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-12-13
在线时间
10 小时
 楼主| 发表于 2019-8-7 21:25:47 | 显示全部楼层
翼行园子 发表于 2019-8-7 17:41
使用DR寄存器地址做外设基地址 不需要递增的 DMA_PeripheralInc_Disable这个就行了  测电压的话 一个ADC ...

嗯谢谢!我这边想要同时采集两个正弦信号(一个电压一个电流)是不是要用两个ADC
回复

使用道具 举报

10

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2016-8-15
在线时间
413 小时
发表于 2019-8-8 08:50:31 | 显示全部楼层
谈龙照 发表于 2019-8-7 21:25
嗯谢谢!我这边想要同时采集两个正弦信号(一个电压一个电流)是不是要用两个ADC

两个通道就可以了
我的简书:https://www.jianshu.com/u/3e9efbf4a8c2
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-12-13
在线时间
10 小时
 楼主| 发表于 2019-8-12 21:12:32 | 显示全部楼层
流年丶 发表于 2019-8-8 08:50
两个通道就可以了

好的谢谢您
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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