STM8L151系列 单通道ADC数模转换

2024-02-08 00:32

本文主要是介绍STM8L151系列 单通道ADC数模转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IAR软件,使用官方halt库

 

void insertion_sort(u16 a[], u16 length)//插入排序
{
    int len = length;
    int temp;
    int i;//已排好序的序列的下一个元素(待插元素)的下标 
    int j;//有序序列的末尾下标

    for(i = 1;i<len;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: \r\n");
    for(i = 0 ; i< len; i++)
    {
        DBG_PRINT("%d ",a[i]);
    }
    printf("\r\n");
}

/*
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

//    <Slow Channels group(Channel 0 to 23)
//    <Fast Channels group Channel 24 to 27)
    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<ADC_COLLECTION_COUNT; 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<ADC_COLLECTION_COUNT - 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数模转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689419

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式