STM8L151系列 单通道ADC数模转换

发布者:w2628203123最新更新时间:2020-02-19 来源: eefocus关键字:STM8L151系列  单通道  ADC  数模转换 手机看文章 扫描二维码
随时随地手机看文章

IAR软件,使用官方halt库


void insertion_sort(u16 a[], u16 length)//插入排序

{

    int len = length;

    int temp;

    int i;//已排好序的序列的下一个元素(待插元素)的下标 

    int j;//有序序列的末尾下标


    for(i = 1;i    {

        temp = a[i];//中间变量 

        j=i-1;

        while(j >= 0 && a[j]>temp){//遍历有序序列,与要插入的元素比较 

            a[j+1] = a[j];//将元素后移,满足条件后移一个位置

            j--; 

        }

        a[j+1] = temp; //插入  

    }



    printf("after_insert: rn");

    for(i = 0 ; i< len; i++)

    {

        DBG_PRINT("%d ",a[i]);

    }

    printf("rn");

}


/*

https://blog.csdn.net/Leo_Luo1/article/details/77370818

    另外STM8L内部还提供了1.2V的参考电压,但是在使用这个参考电压的时候有一些不稳定的现象。ADC_ChannelCmd()


    比如在采集这个参考电压时,如果在读取函数前面加延时,延时的时间不一样得到的采样结果是不一样的,


    另外,这个参考我根据外面提供的VCC作为参考电压来计算的话,得到的值也不是1.2V,这个地方不知道是我的配置出了问题还是这个参考电压本身有问题。

datasheet中写道以下一句话用于解释为什么你的第一次采样不对

The ADC uses the internal reference voltage, so the user must make sure this reference voltage is woken up before enabling the ADC after an exit from Halt or Active-halt mode. 

When enabled, the ADC needs a stabilization time (tWKUP) before starting the first conversion (refer to the device datasheet) Example: after an RTC wakeup (alarm) from Halt mode, 

the ADC is first enabled. Then, the firmware waits for a tWKUP time (3 μs) and the conversion can be started by setting the START bit in the ADC_CR1 register. 

也就是在ref电压稳定后,大概需要等待3us

*/


void init_adc(ADC_Channel_TypeDef ADC_Channel_x)

{

    ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_2);//单次转换,12位分辨率(精度),ADC_clock: 4 /2 =2MHz


//    //        ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_4Cycles); //ADC_clock: 2MHz; 配置ADC为快速通道,采样时间周期为9;  {4; 9; 16; 24; 48; 96; 192; 384;}


    ADC_Cmd(ADC1, ENABLE); //使能ADC1

    ADC_ChannelCmd(ADC1, ADC_Channel_x, ENABLE);//使能 通道x


//    ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);  //内部参考电压



    ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE); //Disable End of conversion ADC1 Interrupt

    ADC_DMACmd(ADC1,DISABLE); // 禁止DMA


    ADC_SoftwareStartConv (ADC1);//开始ADC软件转换

}



unsigned short adc_handling(ADC_Channel_TypeDef ADC_Channel_x)

{

    u16 get_value = 0;


    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)) ;//等待转换结束

    ADC_ClearFlag (ADC1, ADC_FLAG_EOC);//清除对应标志


    get_value = ADC_GetConversionValue (ADC1);//获取转换值


    return get_value;

}



unsigned short adc_common(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin, ADC_Channel_TypeDef adc_channel)

{

#define ADC_COLLECTION_COUNT    10

    u8 i = 0;

    long sum = 0;

    u16 value=0, tmp_value[ADC_COLLECTION_COUNT] = {0};


    GPIO_Init(GPIOx, GPIO_Pin, GPIO_Mode_In_FL_No_IT);

    CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//开启ADC时钟


    for(i=0; i    {

        init_adc(adc_channel);

        tmp_value[i] = adc_handling(adc_channel);

    }


    // 应该在操作ADC的寄存器关停它之后,才停止它的时钟。

    ADC_ChannelCmd(ADC1, adc_channel, DISABLE);//禁用 通道x

    ADC_Cmd(ADC1, DISABLE);

    CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);// 禁用ADC时钟


//    GPIO_Init(GPIOx, GPIO_Pin, GPIO_Mode_Out_PP_Low_Slow); //不要设置输出模式;  悬空输入就是 低功耗

    insertion_sort(tmp_value, ADC_COLLECTION_COUNT); // 排序: 去掉 最大值,最小值; 在求平均值

    for(i=1; i        sum += tmp_value[i];


    value = sum / (ADC_COLLECTION_COUNT - 2);

    return value;

}


unsigned short get_adc(void)

{

    return adc_common(GPIOD, GPIO_Pin_2, ADC_Channel_20); //  xx电阻的ADC; PD^2; ADC1_IN20(通道20) 

}

关键字:STM8L151系列  单通道  ADC  数模转换 引用地址:STM8L151系列 单通道ADC数模转换

上一篇:stm8s 串口通讯源码程序(8位数据,奇校验,2个停止位)
下一篇:STM8 一位共阳数码管0至F数码显示

推荐阅读最新更新时间:2024-11-03 09:29

avr单片机精练的两路ADC代码+仿真图
电路原理图如下: #include iom16v.h #include macros.h #define uchar unsigned char #define uchar unsigned int const uchar SEG_CODE = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}; uchar display = {0,0,0,10,0,0,0,10}; void delay(uint mS); void main() { uchar i; DDRA = 0xfc;
[单片机]
avr单片机精练的两路<font color='red'>ADC</font>代码+仿真图
功耗仅为15.5mW的16位1MSPS模数转换器
iframe style="POSITION: absolute; TOP: 0px; LEFT: 0px" id=google_ads_frame2 height=280 marginHeight=0 src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-1728267113733206&output=html&h=280&slotname=6802727683&w=336&lmt=1290926130&flash=10.2.152.26&url=http%3A%2F%2Fwww.epdoc.cn%2Fad%2F20594.html&dt=129852
[模拟电子]
STM32 ADC单次转换实例
ADC的初始化步骤: 1.初始化ADC所用的通道IO 2.开启ADC的时钟并初始化ADC的结构体 3.调用ADC_Cmd函数进行使能ADC,目的是可以进行读写ADC的寄存器 4.校准ADC(这一步不是必须的,校准ADC时ADC硬件会生成一个校准码,来减小测量误差,校准过的ADC比不校准的准确) 5.调用ADC_RegularChannelConfig写入规则通道的信息(包括写入SQR寄存器的值,采样时间等) 6.调用ADC_SoftwareStartConvCmd函数开启ADC采样 7.等待采样完成,并读取ADC数据 ADC部分代码如下: #include adc.h static void ADC_GPIO_Config(vo
[单片机]
STM32 <font color='red'>ADC</font>单次转换实例
STM32 ADC电压值的计算
在使用STM32的ADC进行检测电压时必须回涉及到电压值的计算,为了更高效率的获取电压,现在有以下三种方法: 你得到的结果是你当前AD引脚上的电压值相对于3.3V和4096转换成的数字. 假如你得到的AD结果是ADC_DR这个变量,他们存在以下关系: ADC_DR/当前电压值 = 4096/3300毫伏如果你反过程想得到当前电压值,可以如下计算: unsigned long Voltage; Voltage = ADC_DR; //---假设你得到的AD结果存放到ADC_DR这个变量中; Voltage = (Voltage * 3300)/4096; //----你就得到了正确的电压结果,单位是mV 一般出于效率
[单片机]
串行LVDS接口ADC改善电路板的布线设计
当共模信号较难处理或对系统有负面影响的时候,需要进行信号调理。部分系统的设计会将模拟变换器输出的单端信号转为全差分信号,然后将这些信号传送到差分输入ADC。这种设计的优点是,大部分混入差分线路的噪声会同时出现在两条线路上 (假设差分线路都是按差分方式平衡布局)。 输入信号转为数字信号之后,便必须传送到DSP或ASIC/FPGA,以便进行处理。全差分输出信号电路通过两条对称的线路输出及吸收电流。低电压差分信号 (LVDS) 便是这种信号。ADC12QS065 芯片就采用了 LVDS 技术,可解决系统这方面的问题 (见图 1)。 图1  ADC12QS065芯片的简化框图 图2 CMOS 与 LVDS 两种电路板布局的比较
[嵌入式]
德州仪器推出 ADC 驱动器,将性能功耗比提升8倍
2012 年 3 月 30日,北京讯 日前,德州仪器 (TI) 宣布推出全差动模数转换器 (ADC) 驱动器,比同类器件性能功耗比提高 8 倍以上,重新定义了低功耗放大器市场。THS4531 全差动放大器静态电流仅为 250 uA,带宽达 36 MHz,可充分满足流量计与便携式医疗设备等便携式高密度系统的高性能与超低功耗需求。如欲了解更多详情或订购样片,敬请访问:www.ti.com.cn/product/cn/ths4531。 THS4531 的主要特性与优势: • 36 MHz 带宽、220 V/us 的压摆率以及 0.01% 到 150 ns 快速建立时间,可为驱动高采样率转换器缩短数据采集时间; • 0.5 uA 的断
[模拟电子]
STC单片机内置ADC的使用方法
STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。ADC转换过程需要17个机器周期。通过对相关功能寄存器的适当配置,就可以控制其工作。下面就对相关功能寄存器进行介绍。 A/D转换寄存器总表: 寄存器 地址 名称 7 6 5 4 3 2 1 0 初始初
[单片机]
采样时钟抖动对ADC信噪比的影响及抖动时钟电路
ADC是现代数字解调器和软件无线电接收机中连接模拟信号处理部分和数字信号处理部分的桥梁,其性能在很大程度上决定了接收机的整体性能。在A/D转换过程中引入的噪声来源较多,主要包括热噪声、ADC电源的纹波、参考电平的纹波、采样时钟抖动引起的相位噪声以及量化错误引起的噪声等。除由量化错误引入的噪声不可避免外,可以采取许多措施以减小到达ADC前的噪声功率,如采用噪声性能较好的放大器、合理的电路布局、合理设计采样时钟产生电路、合理设计ADC的供电以及采用退耦电容等。 本文主要讨论采样 时钟抖动 对 ADC 信噪比性能的影响以及低抖动采样时钟电路的设计。      (a)12位ADC理想信噪比      (b)AD
[模拟电子]
采样时钟抖动对<font color='red'>ADC</font>信噪比的影响及抖动时钟电路
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved