找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3884|回复: 0
收起左侧

STM32F103两路AD同时检测并通过串口显示程序

[复制链接]
ID:361044 发表于 2019-2-20 15:20 | 显示全部楼层 |阅读模式
经过测试,完全可用

单片机源程序如下:
  1. #include "adc.h"
  2. #include "SysTick.h"
  3. #define ADC1_DR_Address ((u32)0x40012400+0x4c)
  4. uint16_t ADC_ConvertedValue[3];
  5. /*******************************************************************************
  6. * 函 数 名         : ADCx_Init
  7. * 函数功能                     : ADC初始化       
  8. * 输    入         : 无
  9. * 输    出         : 无
  10. *******************************************************************************/
  11. void ADCx_Init(void)
  12. {
  13.         GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量       
  14.         ADC_InitTypeDef  ADC_InitStructure;
  15.         DMA_InitTypeDef DMA_InitStructure;
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);       
  17.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
  18.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  19.        
  20.         DMA_DeInit(DMA1_Channel1);
  21.         DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&ADC1->DR;
  22.         DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;
  23.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  24.         DMA_InitStructure.DMA_BufferSize = 2;                                       
  25.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  26.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;      
  27.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  28.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  29.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  30.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  31.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  32.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  33.         DMA_Cmd(DMA1_Channel1, ENABLE);
  34.        
  35.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
  36.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
  37.         //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  38.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  39.        
  40.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
  41.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
  42.         //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  43.         GPIO_Init(GPIOB,&GPIO_InitStructure);       

  44.         ADC_DeInit(ADC1);//?? ADC1,?? ADC1,
  45.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  46.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式       
  47.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//开启连续转换
  48.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发
  49.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐       
  50.         ADC_InitStructure.ADC_NbrOfChannel = 2;//1个转换在规则序列中 也就是只转换规则序列1
  51.         ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
  52.        
  53.         ADC_DMACmd(ADC1, ENABLE);
  54.         ADC_Cmd(ADC1, ENABLE);//开启AD转换器
  55.        
  56.         ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
  57.         while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
  58.        
  59.         ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
  60.         while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

  61.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
  62. }

  63. /*******************************************************************************
  64. * 函 数 名         : Get_ADC_Value
  65. * 函数功能                   : 获取通道ch的转换值,取times次,然后平均        
  66. * 输    入         : ch:通道编号
  67.                                          times:获取次数
  68. * 输    出         : 通道ch的times次转换结果平均值
  69. *******************************************************************************/
  70. u16 Get_ADC_Value(u8 ch,u8 times)
  71. {
  72.         u32 temp_val=0;
  73.         u8 t;
  74.         //设置指定ADC的规则组通道,一个序列,采样时间
  75.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                            
  76.        
  77.         for(t=0;t<times;t++)
  78.         {
  79.                 //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能       
  80.                 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
  81.                 //temp_val+=ADC_GetConversionValue(ADC1);
  82.                 temp_val+=ADC_ConvertedValue[0];
  83.                 delay_ms(5);
  84.         }
  85.         return temp_val/times;
  86. }
  87. u16 Get_ADC1_Value(u8 ch,u8 times)
  88. {
  89.         u32 temp_val=0;
  90.         u8 t;
  91.         //设置指定ADC的规则组通道,一个序列,采样时间
  92.         ADC_RegularChannelConfig(ADC1, ch, 2, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                            
  93.        
  94.         for(t=0;t<times;t++)
  95.         {
  96.                 //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能       
  97.                 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
  98.                 //temp_val+=ADC_GetConversionValue(ADC1);
  99.                 temp_val+=ADC_ConvertedValue[1];
  100.                 delay_ms(5);
  101.         }
  102.         return temp_val/times;
  103. }
复制代码
  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "led.h"
  4. #include "usart.h"
  5. #include "adc.h"


  6. /*******************************************************************************
  7. * 函 数 名         : main
  8. * 函数功能                   : 主函数
  9. * 输    入         : 无
  10. * 输    出         : 无
  11. *******************************************************************************/
  12. int main()
  13. {
  14.         u8 i=0;
  15.         u16 value=0;
  16.         float vol;
  17.         u16 value1=0;
  18.         float vol1;
  19.         SysTick_Init(72);
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
  21.         LED_Init();
  22.         USART1_Init(9600);
  23.         ADCx_Init();
  24.        
  25.         while(1)
  26.         {
  27.                 i++;
  28.                 if(i%20==0)
  29.                 {
  30.                         led1=!led1;
  31.                 }
  32.                
  33.                 if(i%50==0)
  34.                 {
  35.                         value1=Get_ADC1_Value(ADC_Channel_9,20);
  36.                         value=Get_ADC_Value(ADC_Channel_1,20);
  37.                         //printf("检测AD值为:%d\r\n",value);
  38.                         vol=(float)value*(3.3/4096);
  39.                         vol1=(float)value1*(3.3/4096);
  40.                         printf("检测电压值为:%.2fV\r\n",vol1);
  41.                         printf("检测电压值为:%.2fV\r\n",vol);
  42.                 }
  43.                 delay_ms(10);       
  44.         }
  45. }
复制代码


所有资料51hei提供下载:
两路ADC带DMA模数转换.7z (185.71 KB, 下载次数: 73)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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