STM32通用文件(adc-delay)

STM32延时与ADC采样
本文介绍了一个基于STM32的延时函数实现方法,并详细展示了ADC初始化配置及采样平均值获取的过程。通过对ADC通道进行精确配置,实现了稳定的模拟信号采集。

delay.c

#include "delay.h"
#include "sys.h"
static u8  fac_us=0;//usÑÓʱ±¶³ËÊý
static u16 fac_ms=0;//msÑÓʱ±¶³ËÊý
void delay_init()    
{

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //Ñ¡ÔñÍⲿʱÖÓ  HCLK/8
    fac_us=SystemCoreClock/8000000; //ΪϵͳʱÖÓµÄ1/8  
    fac_ms=(u16)fac_us*1000;//·ÇucosÏÂ,´ú±íÿ¸ömsÐèÒªµÄsystickʱÖÓÊý   

}                                                      
void delay_us(u32 nus)
{       
    u32 temp;            
    SysTick->LOAD=nus*fac_us; //ʱ¼ä¼ÓÔØ             
    SysTick->VAL=0x00;        //Çå¿Õ¼ÆÊýÆ÷
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //¿ªÊ¼µ¹Êý     
    do
    {
        temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));//µÈ´ýʱ¼äµ½´ï   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //¹Ø±Õ¼ÆÊýÆ÷
    SysTick->VAL =0X00;       //Çå¿Õ¼ÆÊýÆ÷   
} 
void delay_ms(u16 nms)
{                 
    u32 temp;          
    SysTick->LOAD=(u32)nms*fac_ms;//ʱ¼ä¼ÓÔØ(SysTick->LOADΪ24bit)
    SysTick->VAL =0x00;           //Çå¿Õ¼ÆÊýÆ÷
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //¿ªÊ¼µ¹Êý  
    do
    {
        temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));//µÈ´ýʱ¼äµ½´ï   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //¹Ø±Õ¼ÆÊýÆ÷
    SysTick->VAL =0X00;       //Çå¿Õ¼ÆÊýÆ÷          
} 



delay.h

#ifndef __DELAY_H
#define __DELAY_H              
#include "sys.h"     
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif



adc.c

 #include "adc.h"
 #include "delay.h"
 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"


//³õʼ»¯ADC
//ÕâÀïÎÒÃǽöÒÔ¹æÔòͨµÀΪÀý
//ÎÒÃÇĬÈϽ«¿ªÆôͨµÀ0~3                                                                       
void  Adc_Init(void)
{   
    ADC_InitTypeDef ADC_InitStructure; 
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );   //ʹÄÜADC1ͨµÀʱÖÓ


    RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //ÉèÖÃADC·ÖƵÒò×Ó6 72M/6=12,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M

    //PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                         
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       //Ä£ÄâÊäÈëÒý½Å
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4;            //´¬ÓÿØÖÆÆ÷¶æ½Ç
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       //Ä£ÄâÊäÈëÒý½Å
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;            //´¬ÓÿØÖÆÆ÷ÍÆ½ø
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       //Ä£ÄâÊäÈëÒý½Å
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    ADC_DeInit(ADC1);  //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;   //Ä£Êýת»»¹¤×÷ÔÚµ¥Í¨µÀģʽ
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //Ä£Êýת»»¹¤×÷ÔÚµ¥´Îת»»Ä£Ê½
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ת»»ÓÉÈí¼þ¶ø²»ÊÇÍⲿ´¥·¢Æô¶¯
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //ADCÊý¾ÝÓÒ¶ÔÆë
    ADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿
    ADC_Init(ADC1, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷   

    ADC_TempSensorVrefintCmd(ENABLE); //¿ªÆôÄÚ²¿Î¶ȴ«¸ÐÆ÷
    ADC_Cmd(ADC1, ENABLE);  //ʹÄÜÖ¸¶¨µÄADC1

    ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼  

    while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø

    ADC_StartCalibration(ADC1);  //¿ªÆôADУ׼

    while(ADC_GetCalibrationStatus(ADC1));   //µÈ´ýУ׼½áÊø

//  ADC_SoftwareStartConvCmd(ADC1, ENABLE);     //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ

}                 
//»ñµÃADCÖµ
//ch:ͨµÀÖµ 0~3
u16 Get_Adc(u8 ch)   
{
    //ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );  //ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ239.5ÖÜÆÚ                  

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);     //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ  

    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø

    return ADC_GetConversionValue(ADC1);    //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
u8 adc1_flag=0;
u16 adc1_temp_value=0;

u16 Get_Adc_Average1(u8 ch,u8 times)
{
    u16 adc_array[100]={0};
  int i=0;
  u8 ii,jj;
  u32 temp_val=0;////Öмä±äÁ¿
  u32 adc_average=0;

    u8 t;
 for(i=0;i<100;i++)

 {
     adc_array[i]=Get_Adc(ch);
     delay_us(500);
 }
 for(ii=0;ii<99;ii++)
  {
        for(jj=0;jj<99-ii;jj++)
          {
                if(adc_array[jj]>adc_array[jj+1])
                {
                    temp_val=adc_array[jj+1];
                    adc_array[jj+1]=adc_array[jj];
                    adc_array[jj]=temp_val;

        }

      }
  }

  //for(i=0;i<100;i++)
  // printf("adc_array[%d]=%d\r\n",i,adc_array[i]);
     for(t=40;t<50;t++)
      {
            adc_average+=adc_array[t];
    }
        //adc_temp_value=adc_array[50];
        memset(adc_array,0,100);//////¶ÔÊý×éÇå0,½«adc_arrayµÄǰ100
        adc_average=adc_average/10;
        if(adc1_flag==0)////¼Ç¼һ´Îµ±Ç°Öµ

        {
            adc1_flag=1;
            adc1_temp_value=adc_average;
    }
        // printf("adc_average=%d\r\n",adc_average);
        // printf("adc_temp_value=%d\r\n",adc_temp_value);
        if(abs(adc1_temp_value-adc_average)<=8)////Èç¹ûÕâ´ÎºÍÉϴβɼ¯µÄ²îֵСÓÚ=6£¬¾Í±íʾ½ÇÎ»ÒÆÃ»ÓÐת¶¯£¬±£³ÖÉϴεÄÖµ
        {
            adc_average=adc1_temp_value;
    }
        else
        {
            adc1_flag=0;
      }
//      printf("adc_average=%d\r\n",adc_average);
//      printf("adc_temp_value=%d\r\n",adc_temp_value);
    //  printf("abs=%d\r\n",abs(adc1_temp_value-adc_average));
//      if(abs(adc_temp_value-adc_average)>=1&&adc_flag==1)
//      {
//          printf("888\r\n");
//          
//          adc_average=adc_temp_value;
//      }
//       else
//       {
//           adc_flag=0;
//      }
        //printf("adc_average=%d\r\n",adc_average);
      return adc_average;
}    

u8 adc4_flag=0;
u16 adc4_temp_value=0;

u16 Get_Adc_Average4(u8 ch,u8 times)
{
    u16 adc_array[100]={0};
  int i=0;
  u8 ii,jj;
  u32 temp_val=0;////Öмä±äÁ¿
  u32 adc_average=0;

    u8 t;
 for(i=0;i<100;i++)

 {
     adc_array[i]=Get_Adc(ch);
     delay_us(500);
 }
 for(ii=0;ii<99;ii++)
  {
        for(jj=0;jj<99-ii;jj++)
          {
                if(adc_array[jj]>adc_array[jj+1])
                {
                    temp_val=adc_array[jj+1];
                    adc_array[jj+1]=adc_array[jj];
                    adc_array[jj]=temp_val;

        }

      }
  }

  //for(i=0;i<100;i++)
  // printf("adc_array[%d]=%d\r\n",i,adc_array[i]);
     for(t=40;t<50;t++)
      {
            adc_average+=adc_array[t];
    }
        //adc_temp_value=adc_array[50];
        memset(adc_array,0,100);//////¶ÔÊý×éÇå0
        adc_average=adc_average/10;
        if(adc4_flag==0)////¼Ç¼һ´Îµ±Ç°Öµ

        {
            adc4_flag=1;
            adc4_temp_value=adc_average;
    }
        // printf("adc_average=%d\r\n",adc_average);
        // printf("adc_temp_value=%d\r\n",adc_temp_value);
        if(abs(adc4_temp_value-adc_average)<=8)////Èç¹ûÕâ´ÎºÍÉϴβɼ¯µÄ²îֵСÓÚ=6£¬¾Í±íʾ½ÇÎ»ÒÆÃ»ÓÐת¶¯£¬±£³ÖÉϴεÄÖµ
        {
            adc_average=adc4_temp_value;
    }
        else
        {
            adc4_flag=0;
      }
//      printf("adc_average=%d\r\n",adc_average);
//      printf("adc_temp_value=%d\r\n",adc_temp_value);
        //printf("abs=%d\r\n",abs(adc4_temp_value-adc_average));
//      if(abs(adc_temp_value-adc_average)>=1&&adc_flag==1)
//      {
//          printf("888\r\n");
//          
//          adc_average=adc_temp_value;
//      }
//       else
//       {
//           adc_flag=0;
//      }
        //printf("adc_average=%d\r\n",adc_average);
      return adc_average;
}    


u8 adc7_flag=0;
u16 adc7_temp_value=0;

u16 Get_Adc_Average7(u8 ch,u8 times)
{
    u16 adc_array[100]={0};
  int i=0;
  u8 ii,jj;
  u32 temp_val=0;////Öмä±äÁ¿
  u32 adc_average=0;

    u8 t;
 for(i=0;i<100;i++)

 {
     adc_array[i]=Get_Adc(ch);
     delay_us(500);
 }
 for(ii=0;ii<99;ii++)
  {
        for(jj=0;jj<99-ii;jj++)
          {
                if(adc_array[jj]>adc_array[jj+1])
                {
                    temp_val=adc_array[jj+1];
                    adc_array[jj+1]=adc_array[jj];
                    adc_array[jj]=temp_val;

        }

      }
  }

  //for(i=0;i<100;i++)
  // printf("adc_array[%d]=%d\r\n",i,adc_array[i]);
     for(t=40;t<50;t++)
      {
            adc_average+=adc_array[t];
    }
        //adc_temp_value=adc_array[50];
        memset(adc_array,0,100);//////¶ÔÊý×éÇå0
        adc_average=adc_average/10;
        if(adc7_flag==0)////¼Ç¼һ´Îµ±Ç°Öµ

        {
            adc7_flag=1;
            adc7_temp_value=adc_average;
    }
        // printf("adc_average=%d\r\n",adc_average);
        // printf("adc_temp_value=%d\r\n",adc_temp_value);
        if(abs(adc7_temp_value-adc_average)<=8)////Èç¹ûÕâ´ÎºÍÉϴβɼ¯µÄ²îֵСÓÚ=6£¬¾Í±íʾ½ÇÎ»ÒÆÃ»ÓÐת¶¯£¬±£³ÖÉϴεÄÖµ
        {
            adc_average=adc7_temp_value;
    }
        else
        {
            adc7_flag=0;
      }
//      printf("adc_average=%d\r\n",adc_average);
//      printf("adc_temp_value=%d\r\n",adc_temp_value);
        //printf("abs=%d\r\n",abs(adc4_temp_value-adc_average));
//      if(abs(adc_temp_value-adc_average)>=1&&adc_flag==1)
//      {
//          printf("888\r\n");
//          
//          adc_average=adc_temp_value;
//      }
//       else
//       {
//           adc_flag=0;
//      }
        //printf("adc_average=%d\r\n",adc_average);
      return adc_average;
}    

adc.h

#ifndef __ADC_H
#define __ADC_H 
#include "sys.h"

//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEKÕ½½¢STM32¿ª·¢°å
//ADC ´úÂë     
//ÕýµãÔ­×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2012/9/7
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved                                     
////////////////////////////////////////////////////////////////////////////////// 

void Adc_Init(void);
u16  Get_Adc(u8 ch); 
u16 Get_Adc_Average1(u8 ch,u8 times); 
u16 Get_Adc_Average4(u8 ch,u8 times);
u16 Get_Adc_Average7(u8 ch,u8 times);
#endif 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值