文章目录

  • 引脚功能
  • 软件配置
  • SWIM复用为ADC之后采样值不准确

引脚功能

  • STM8S001有三个ADC输入通道,但是分布在两个引脚,所以可以说只有两个可用的ADC。
  • 分别是PD6、PD5、PD3,对应AIN6、AIN5、AIN4,分布在第一脚和第八脚。
  • 我使用两个ADC
    • 具有SWIM功能的第八脚,复用为AIN5;命名为IGN
    • 第一脚,配置为AIN6;命名为MOTOn

软件配置

#define ADC_IGN_PORT            GPIOD
#define ADC_IGN_PIN             GPIO_PIN_5#define ADC_MOTORn_PORT         GPIOD
#define ADC_MOTORn_PIN          GPIO_PIN_6#define ADC_IGN_CHANNEL                 ADC1_CHANNEL_5
#define ADC_MOTORn_CHANNEL              ADC1_CHANNEL_6#define ADC_VREF_VOLTAGE          (5.0)           /**< 5V */
#define ADC_RESOLUTION_VALUE            (1024)          /**< ADC ressolution: 10bit *//* 初始化ADC函数 */
void adc_init(void)
{GPIO_Init_redef(ADC_IGN_PORT, ADC_IGN_PIN, GPIO_MODE_IN_FL_NO_IT);GPIO_Init_redef(ADC_MOTORn_PORT, ADC_MOTORn_PIN, GPIO_MODE_IN_FL_NO_IT);ADC1->CR1 &= (~ADC1_CR1_ADON);/* Clear the align bit */ADC1->CR2 &= (uint8_t)(~ADC1_CR2_ALIGN);/* Configure the data alignment */ADC1->CR2 |= ADC1_ALIGN_RIGHT;/* Set the single conversion mode */ADC1->CR1 &= (uint8_t)(~ADC1_CR1_CONT);/* Clear the external trigger selection bits */ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTSEL);/* Disable the selected external trigger */ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTTRIG);                /* Set the selected external trigger */ADC1->CR2 |= (uint8_t)(ADC1_EXTTRIG_GPIO);/* Clear the SPSEL bits */ADC1->CR1 &= (uint8_t)(~ADC1_CR1_SPSEL);/* Select the prescaler division factor according to ADC1_PrescalerSelection values */ADC1->CR1 |= (uint8_t)(ADC1_PRESSEL_FCPU_D18);ADC1->TDRL |= (uint8_t)0xFF;ADC1->TDRH |= (uint8_t)0xFF;   /* Enable the ADC1 peripheral */ADC1->CR1 |= (uint8_t)ADC1_CR1_ADON;adc_data.curr_channel = IGN;     /**< 1-MOTORn channel; 0-IGN channel */adc_channel_set(adc_data.curr_channel);
}/* 设置通道函数 */
void adc_channel_set(adc_channel_name_t ch)
{ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH);if(ch == IGN){ADC1->CSR |= (uint8_t)(ADC_IGN_CHANNEL);}else if(ch == MOTORn){ADC1->CSR |= (uint8_t)(ADC_MOTORn_CHANNEL);}ADC1->CR1 |= (uint8_t)ADC1_CR1_ADON;
}/* 读取原始数据函数 */
uint16_t read_adc_orig_value(void)
{uint16_t temph = 0;uint8_t templ = 0;templ = ADC1->DRL;temph = ADC1->DRH;temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8));return temph;
}

SWIM复用为ADC之后采样值不准确

  • 其实并不是ADC不准确,而是外部电路导致了ADC引脚阻抗过大,从而导致采样不准确。
  • 我用IGN引脚采12V的IGN电压,开始使用了220k和22k的分压电阻,导致引脚阻抗过大,采样不准确。
  • 后来使用5.6k和2k,AD值已经很接近理论值了。
  • 后来怕电流过大烧坏芯片,还是选择了56k和10k,AD值比理论值略高,经过线性处理后达到准确值。

以下是不通电压时的AD电压值。

也是线性的,故进行了线性换算,得出准确值。

float get_adc_voltage(adc_channel_name_t ch)
{if(ch == IGN){return (1.178 * adc_data.voltage_flt[ch] - 0.882);}else{return (adc_data.voltage_flt[ch]);}
}

// end
// 2019.08.10

stm8s001 - SWIM复用为ADC输入 ADC电压值不准确?相关推荐

  1. STM32 ADC输入采集电压

    #include "stm32f10x.h" // Device header #include "stdio.h" #include "delay. ...

  2. ADC实验(读取引脚电压值)

    目录 ADC 简介 什么是ADC I.MX6ULL ADC 简介 ADC寄存器介绍 配置步骤 硬件原理分析 实验程序编写 编译下载验证 编写Makefile 和链接脚本 编译下载 ADC 是一种常见的 ...

  3. ADC输入噪声面面观——噪声是利还是弊?

    简介 所有模数转换器(ADC)都有一定量的"折合到输入端噪声",可以将其模拟为与无噪声ADC输入串联的噪声源.折合到输入端噪声与量化噪声不同,后者仅在ADC处理交流信号时出现.多数 ...

  4. stm32 adc输入电压范围_正点原子【STM32-F407探索者】第二十五章 光敏传感器实验...

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章我们将向大家介绍探索者 STM32F4 开发板自带的 ...

  5. 如何利用单片机的ADC模块(或者独立的ADC芯片)得到接入ADC管脚上的实际电压值?

    这个问题,是第一次接触ADC时候,大家都会遇到的问题. 会读到什么值 单片机会读到什么值?需要看一个特性,就是几位的ADC,在手册上就会给出,例如,STM32的ADC是12位的.另外,还有8位,10位 ...

  6. STM32L031 ADC管脚电压采样

    STM32L031 ADC管脚电压采样 为了更精确的体现ADC对管脚采样的电压值,需要对当前的供电电压的变化也进行参考计算,涉及到STM32 Internal voltage reference (V ...

  7. zigbee协议栈ADC采集外部电压

    ADC 由于最近在做一个项目,其中一个步骤是需要CC2530片内ADC采集外设的电压值,三天反思不得其解,终于解决了这个问题. zigbee协议栈是有错误的,稍后我会写出来 ADC支持14位模数转换, ...

  8. STM32使用ADC+电位器测电压

    一.WDD35D-4导电塑料电位器 1. 电位器 电位器是具有三个引出端.阻值可按某种变化规律调节的电阻元件.电位器通常由电阻体和可移动的电刷组成.当电刷沿电阻体移动时,在输出端即获得与位移量成一定关 ...

  9. STM32F103+ADC采集实时电压+LCD1602A显示

    STM32F103+ADC采集实时电压+LCD1602A显示 前言 代码 前言 刚开始学习STM32,用的是开发板是野火的指南者,这款板子网上资源很多.在学习ADC和LCD部分时,想利用手头仅有的LC ...

最新文章

  1. golang for循环 使用多个变量
  2. C++程序设计之保存和读取二进制文件
  3. Idea控制台中文乱码解决方案
  4. 倾斜模型精细化处理_推荐一款好用的倾斜摄影精细化单体建模软件——OSketch...
  5. vue axios全攻略
  6. go 数据类型和操作符
  7. [蓝桥杯2018决赛]三角形面积-数论
  8. matlab电类,985电气研二,有发过考研经验贴 电气电力类的有
  9. 金字塔原理只需读前几页
  10. C/C++线程与多线程工作笔记0006---VC++中_T()的作用
  11. vueCli3 身份证正则校验
  12. 计算机图形学中的边标志算法c++程序实现2
  13. python主要用来做什么-python语言都可以做什么
  14. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
  15. Android开发前景如何?2021年,Android开发者的前行方向
  16. 色彩搭配及设计金字塔的总结
  17. java深克隆 浅克隆_通过Java中深克隆与浅克隆来理解克隆
  18. 如何制作人脸微笑检测程序
  19. 微信的新功能,快来试一下
  20. 厚颜无耻的免费使用Visio和project2016

热门文章

  1. 有没有视频合并软件?合并视频这样做
  2. 关于网线,你了解多少?
  3. Windows蓝牙设备自动断开问题
  4. idea打开后不显示界面,win+D快捷键解决问题
  5. php 字体好看点,字丑不用怕,带你轻松画出好看字体!
  6. 处理器与大力神杯,夺冠或许并不需要11人
  7. 有道词典_每日一句_2019/09
  8. 2.4g和5g要不要合并_路由器WiFi的2.4g和5g要不要合并?
  9. uniapp 中 通过经纬度获取地址详情(vue)
  10. 21-7-09 主要元素