OpenEdv-开源电子网

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

关于STM32MINI的ADC采集多种数据

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-12-25
在线时间
1 小时
发表于 2017-12-25 19:18:30 | 显示全部楼层 |阅读模式
10金钱
新手上路。做电子设计比赛(新手赛),想用STM32MINI的ADC分别采集电压信号(0-20V),电流信号(0-1A),电阻(20k欧),不知道该怎么设置。一个ADC多通道采集(这样的话,信号独立吗),三个ADC分别采集。但是正点原子的资料只有ADC1的,不知道该怎么设置。敢情各位老师教教我,很急,最好有程序图,刚上路有点懵。

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

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-12-25 21:25:49 | 显示全部楼层
这样你再急,别人也帮不了你的,等人给你程序喽
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-12-25
在线时间
1 小时
 楼主| 发表于 2017-12-25 22:41:54 | 显示全部楼层
[mw_shl_code=applescript,true]#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"  
#include "led.h"
#include "adc.h"

int main(void)
{
        char strv[32]="";
        char stri[32]="";
        u8 t;
        float adv,adi,adr;
        float tempv,tempi,tempr;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
        delay_init();             //3õê¼»ˉÑóê±oˉêy                              
        uart_init(9600);          //3õê¼»ˉ′®¿ú2¨ìØÂê9600                
        KEY_Init();        
        LED_Init();                         //3õê¼»ˉLED       
        LCD_Init();                     //3õê¼»ˉLCD
       
        Adc_Init();              //3õê¼»ˉADC
        LCD_Clear(WHITE);
        POINT_COLOR=RED;
        LCD_ShowString(30,40,200,24,24, "***MENU***");
        POINT_COLOR=BLUE;
        LCD_ShowString(30,80,200,16,16, "Voltage:00.0000 V");            //μçÑ1ÏÔê¾
        LCD_ShowString(30,100,200,16,16, "Current:0.000 A");             //μçá÷ÏÔê¾
        LCD_ShowString(30,120,200,16,16, "Resistance:0000Ohm");          //μç×èÏÔê¾
    while(1)
                {
           t=KEY_Scan(0);
               switch(t)
                        {
                         case KEY0_PRES:
                     while(1)
                 {
                     adv=Get_Adc_Average1(ADC_Channel_0,10);
                     adv=(float)adv*(20.00/4095);
                                         tempv=adv;
                                         sprintf(strv,"%.4f V\n",tempv);
                                         LCD_ShowString(94,80,200,16,16,strv);
                                         //LCD_ShowxNum(118,80,adv,2,16,0);
                     LED0=!LED0;
                     delay_ms(250);
                 }break;
                         case KEY1_PRES:
                                 while(1)
                                 {
                                         adi=Get_Adc_Average2(ADC_Channel_9,10);
                                         LCD_ShowxNum(94,140,adv,4,16,0);
                                         adi=(float)adi*(1.0/4096);
                                         tempi=adi;
                                         printf(stri,"%.3f A\n",tempi);
                                         LCD_ShowString(94,100,200,16,16,stri);
                                         LED1=!LED1;
                                         delay_ms(250);
                                 }break;
                     case WKUP_PRES:
                                 while(1)
                             {
                                        adr=Get_Adc_Average3(ADC_Channel_10,10);
                                         adr=(float)adr*(20000/4096);
                                         
                                         LCD_ShowxNum(118,120,adr,1,16,0);
                                       
                                         //LCD_ShowxNum(110,120,adr,3,16,0X80);
                                         LED0=!LED0;
                                         LED1=!LED1;
                                         delay_ms(250);
                                 }break;
                        }       
                }       
        }       
           

[/mw_shl_code]
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-12-25
在线时间
1 小时
 楼主| 发表于 2017-12-25 22:42:45 | 显示全部楼层
[mw_shl_code=c,true] #include "adc.h"
#include "delay.h"

/*    èyí¨μà2é¼ˉ10′Π    */          
__IO uint16_t ADC1ConvertedValue[10][3];


void  Adc_Init(void)
{        
        ADC_InitTypeDef       ADC_InitStructure;                                        //ADC3õê¼»ˉ½á11ìå
    DMA_InitTypeDef       DMA_InitStructure;                                        //DMA3õê¼»ˉ½á11ìå
    GPIO_InitTypeDef      GPIO_InitStructure;                                       //GPIO3õê¼»ˉ½á11ìå
        /* ê1Äü ADC1, DMA1 oí GPIO ê±Öó */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA, ENABLE);

    /*                            DMA1 Stream1 channe1 ÅäÖà                            */
        DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_BufferSize=30;                                            //»o′æêy¾Y¸öêy
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;                                //òÔíaéèÎaêy¾YÔ′
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;                                      //2»ê1óÃÄú′æμ½Äú′æ
        DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)ADC1ConvertedValue;;             //Äú′æÖD′æ′¢DMA′«êä1yà′μÄêy¾Y»ùμØÖ·
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;               //Äú′æêy¾YÎa°ë×Ö 16루ADC¾«¶èÎa12룩
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;                           //Äú′æμØÖ·òaÔö¼ó
        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;                                   //DMA1¤×÷ÔúÑ-»·Ä£ê½
        DMA_InitStructure.DMA_PeripheralBaseAddr= (uint32_t)&ADC1->DR;                  //êy¾YÔ′μØÖ·  ADCêy¾Y¼Ä′æÆ÷μØÖ·
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;       //DMAíaéèêy¾Y¿í¶è
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;                  //íaéèμØÖ·Ôö¼ó
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;                                      //DMAóÅÏè¼¶¸ß
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);                                    //DMA3õê¼»ˉ
        DMA_Cmd(DMA1_Channel1, ENABLE);                                                     //ê1ÄüDMA

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//PA1
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;                                      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//2é¼ˉμçÑ1μÄòy½ÅÎaPB1
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;                                      //Ä£ÄaêäèëÄ£ê½
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                //Ëù¶èÎa50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);                                           //3õê¼»ˉêäèë¶Ë¿úPB0
   
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//2é¼ˉμçÑ1μÄòy½ÅÎaPC0
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;                                      //Ä£ÄaêäèëÄ£ê½
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                //Ëù¶èÎa50MHz
    GPIO_Init(GPIOC, &GPIO_InitStructure);                                           //3õê¼»ˉêäèë¶Ë¿úPC0


    //ADC1 3õê¼»ˉ ****************************************************************/
    ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;                                  //ADCá¬DøÄ£꽿a
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;                              //12λêy¾Yóò¶ÔÆë
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;                 //ía2¿¿aÆô1Ø  óéèí¼t¿aÆô
        ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;                                  //ADC1¤×÷Ôú¶àá¢Ä£ê½
        ADC_InitStructure.ADC_NbrOfChannel=3;                                             //¿aÆôí¨μàêyÎa1
        ADC_InitStructure.ADC_ScanConvMode=DISABLE;                                        //á¬Dø¶àí¨μàÄ£ê½
        ADC_Init(ADC1, &ADC_InitStructure);                                                    //¸ù¾YADC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèADCxμļÄ′æÆ÷


     /* ê1Äü ADC1 */
    ADC_Cmd(ADC1, ENABLE);
       
        /* ê1Äü ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
  
        ADC_ResetCalibration(ADC1);                        //ê1Äü¸′λD£×¼  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //μè′y¸′λD£×¼½áêø
       
        ADC_StartCalibration(ADC1);                        //¿aÆôADD£×¼

     /* ê1Äü ADC1 */
    ADC_Cmd(ADC1, ENABLE);
       
        /* ê1Äü ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
  
        ADC_ResetCalibration(ADC1);                        //ê1Äü¸′λD£×¼  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //μè′y¸′λD£×¼½áêø
       
        ADC_StartCalibration(ADC1);                        //¿aÆôADD£×¼

            /* èí¼tÆô¶ˉADC×a»» */
   
        //ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       
}       

u16 Get_Adc1(u8 ch)   
{
          //éèÖÃÖ¸¶¨ADCμÄ1æÔò×éí¨μ࣬ò»¸öDòáD£¬2éÑùê±¼ä
        ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADCí¨μà,2éÑùê±¼äÎa239.5ÖüÆú                                      
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //ê1ÄüÖ¸¶¨μÄADC1μÄèí¼t×a»»Æô¶ˉ1|Äü       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a»»½áêø

        return ADC_GetConversionValue(ADC1);        //·μ»Ø×î½üò»′ÎADC11æÔò×éμÄ×a»»½á1û
}

u16 Get_Adc_Average1(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc1(ch);
                delay_ms(5);
        }
        return temp_val/times;
}          

u16 Get_Adc2(u8 ch)   
{
          //éè&#214;&#195;&#214;&#184;&#182;¨ADCμ&#196;1&#230;&#212;ò×éí¨μà£&#172;ò&#187;&#184;&#246;DòáD£&#172;2é&#209;ùê±&#188;&#228;
        ADC_RegularChannelConfig(ADC1,ADC_Channel_9 , 2, ADC_SampleTime_239Cycles5 );        //ADC1,ADCí¨μà,2é&#209;ùê±&#188;&#228;&#206;a239.5&#214;ü&#198;ú                                      
  
        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;

        return ADC_GetConversionValue(ADC1);        //·μ&#187;&#216;×&#238;&#189;üò&#187;′&#206;ADC11&#230;&#212;ò×éμ&#196;×a&#187;&#187;&#189;á1&#251;
}

u16 Get_Adc_Average2(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc2(ch);
                delay_ms(5);
        }
        return temp_val/times;
}          

u16 Get_Adc3(u8 ch)   
{
          //éè&#214;&#195;&#214;&#184;&#182;¨ADCμ&#196;1&#230;&#212;ò×éí¨μà£&#172;ò&#187;&#184;&#246;DòáD£&#172;2é&#209;ùê±&#188;&#228;
        ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_239Cycles5 );        //ADC1,ADCí¨μà,2é&#209;ùê±&#188;&#228;&#206;a239.5&#214;ü&#198;ú                                      
  
        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;

        return ADC_GetConversionValue(ADC1);        //·μ&#187;&#216;×&#238;&#189;üò&#187;′&#206;ADC11&#230;&#212;ò×éμ&#196;×a&#187;&#187;&#189;á1&#251;
}

u16 Get_Adc_Average3(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc3(ch);
                delay_ms(5);
        }
        return temp_val/times;
}          
[/mw_shl_code]
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-12-25
在线时间
1 小时
 楼主| 发表于 2017-12-25 22:44:51 | 显示全部楼层
KAISER1453 发表于 2017-12-25 22:42
[mw_shl_code=c,true] #include "adc.h"
#include "delay.h"

这样采集的信号是独立的吗?
为什么lcd屏上不能显示文字?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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