无意间看到网上有网友分享ADC注入组采集数据的文章,然后自己试着去配置代码,翻遍了所有的网页说明几乎千篇一律并没有一个实用用的例程,然后就花了一天的时间去研究库函数,搞了很久都不可以,最终功夫不负有心人人我调出来了 看看我的代码 不需要DMA搬运:
单片机代码:
- #include "stm32f10x.h"
- #include "adc.h"
- void Adc_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体变量
- ADC_InitTypeDef ADC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1时钟
- RCC_ADCCLKConfig(RCC_PCLK2_Div2);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引脚选择
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟模式
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
-
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
- 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); //初始化ADC1
- ADC_Cmd(ADC1,ENABLE);
- ADC_ResetCalibration(ADC1); //使能复位校准
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
- ADC_StartCalibration(ADC1); //开启AD校准
- while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
- }
- u16 ADC1_CH_Data(u8 ch)
- {
- ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//设置规则转换通道
- ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能软件转换启动功能
- ADC_Cmd(ADC1,ENABLE); //使能ADC
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
- return ADC_GetConversionValue(ADC1);//读取转换值
- }
- /************注入组**************/
- void ADC_GPIO(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体变量
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引脚选择
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟模式
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
- }
- /****************************
- 注入通道配置
- *****************************/
- void Adc_Init_intput(void)
- {
- ADC_GPIO();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1时钟
- RCC_ADCCLKConfig(RCC_PCLK2_Div2);//时钟分频
- ADC_InitTypeDef ADC_InitStructure;
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式,和ADC2不配合
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式,不扫描
- ADC_InitStructure.ADC_ContinuousConvMode =DISABLE; //单次转换
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
- ADC_Init(ADC1, &ADC_InitStructure);
- /*********** ADC1 注入通道的配置! ************/
- ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None); //外部触发源为软件触发
- ADC_InjectedSequencerLengthConfig(ADC1, 1); //注入转换通道1个
- ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);
- ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_2,0);
- ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_3,0);
- ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);//使能注入组转换功能
- ADC_AutoInjectedConvCmd(ADC1,ENABLE);//使能转换规则组后转换注入组功能
- ADC_Cmd(ADC1,ENABLE);
- ADC_ResetCalibration(ADC1); //使能复位校准
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
- ADC_StartCalibration(ADC1); //开启AD校准
- while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
- ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
- }
- u16 ADC1_CH_Intput_Data(u8 ch)
- {
- ADC_InjectedChannelConfig(ADC1,ch,1,ADC_SampleTime_28Cycles5);//设置规则转换通道
- ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);//使能软件转换启动功能
- ADC_Cmd(ADC1,ENABLE); //使能ADC
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
- return ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//读取转换值
- }
- //中位值滤波
- //方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值
- //优点:能有效克服因偶然因素引起的波动干扰;对温度、液位等变化缓慢的被测参数有良好的滤波效果
- //缺点:对流量,速度等快速变化的参数不宜
- #define N 30
- u16 middleValueFilter(u8 ch) //会获取30个ADC转换值,然后取中间的一个作为本次采样周期的输出值
- {
- u16 value_buf[N];
- u16 i,j,k,temp;
- for( i = 0; i < N; ++i)
- {
- value_buf[i] = ADC1_CH_Intput_Data(ch) ;
-
- }
- for(j = 0 ; j < N-1; ++j)
- {
- for(k = 0; k < N-j-1; ++k)
- {
- //从小到大排序,冒泡法排序
- if(value_buf[k] > value_buf[k+1])
- {
- temp = value_buf[k];
- value_buf[k] = value_buf[k+1];
- value_buf[k+1] = temp;
- }
- }
- }
- return value_buf[(N-1)/2];
- }
- #define V25 1370
- #define Avg_Slope 4.35
- float Get_InternalSensorTemperate(void) //获取内部温度传感器温度值
- {
- int ADC_ConvertedValue;//用来存储ADC转换出来的值
- float Current_Temp;
- ADC_ConvertedValue = middleValueFilter(16) ; //30次取平均
- ADC_ConvertedValue = (ADC_ConvertedValue*825)>>10;//换算成Vsensor
- Current_Temp = (((V25-ADC_ConvertedValue)/Avg_Slope)+25); //计算温度值
- return Current_Temp;
- }
复制代码 全部资料51hei下载地址:
ADC - 注入组.7z
(181.88 KB, 下载次数: 94)
|