• STM8S系列基于IAR开发单通道ADC连续采样示例


    STM8S系列基于IAR开发单通道ADC连续转换模式示例


    • ✨采用寄存器操作方式编程。

    ✨本示例基于STM8S903K3,使用通道6(PD6),作为ADC采集引脚。使用10K可调定位器作为输入端测试。这里直接读取ADC数据寄存器数据进行输出。

    • 🎉 如果需要添加数据平移算法,可以直接采用多次数据累加然后取平均值即可。
    • 📓通道和引脚映射关系
    AIN0->PB6, 
    AIN1->PB5,
    AIN2->PB4,
    AIN3->PD3,
    AIN4->PD5,
    AIN5->PD6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    📖相关寄存器介绍

    • 🌿ADC 配置寄存器 1 (ADC_CR1)
      在这里插入图片描述

    • 🌿ADC 配置寄存器 2 (ADC_CR2)
      在这里插入图片描述

    • 🌿ADC控制/状态寄存器(ADC_CSR)
      在这里插入图片描述

    • 🌿ADC 施密特触发器禁止寄存器低位 (ADC_TDRL)
      在这里插入图片描述

    • 🌿ADC 数据低位寄存器(ADC_DRL)
      在这里插入图片描述

    📑ADC模块初始化

    /**************************************************************************
     * 函数名:ADC_conf
     * 描述  :ADC模块初始化
     * ADC通道 :PD2(AIN3),PD3(AIN4),
     * 输出  :无
     * 返回  :无 
     * 调用  :外部调用 
     *************************************************************************/
    void ADC_conf(unsigned char ch )
    {
       ADC_CR1 = (0<<4)|(1<<1)|(0<<0);    //ADC时钟输入频率为16MHz 这里设置分频系数为2  连续转换模式 先禁止ADC转换        
    //   ADC_CR2 = (1<<3)|(0<<1);           //设置数据右对齐  禁止扫描模式
      ADC_CR2 = 0x08; // 同上,右对齐
       ADC_CSR =(0<<5)|(ch + 1);         //不用外部触发 禁止转换结束中断 设置转换通道为AIN4(PD3)
       ADC_TDRL = ( 1 << (ch + 1 )); //禁止相应通道 施密特触发功能 1左移ch+1位
     //  ADC_TDRH = 4;                      //禁止AIN4施密特触发器功能  
       ADC_CR1 |= 1;                      //第一次写1是从低功耗模式唤醒 
       ADC_CR1 |= 1;                      //在这一位是1的情况下再次写1启动ADC转换
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    📝右对齐方式数据转换实现

    /**************************************************************************
     * 函数名:ADC_GetConversionValue
     * 描述  :获取ADC转换结果
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     *************************************************************************/
    uint16_t ADC_GetConversionValue(void)
    {
      uint16_t value=0;        
      uint8_t templ,temph ;                 // 定义templ存储低8位数据  temph存储高8位数据
      
      while(!(ADC_CSR & 0x80));           //等待转换完成
      templ = ADC_DRL;
      temph = ADC_DRH;                  //读取ADC转换  在左对齐和右对齐模式下 读取数据的顺序不同        
     value = (uint16_t)(templ + (uint16_t)(temph <<  (uint8_t)8)) ; //得到十位精度的数据 0--1024
     //注意是10位的转换精度 value、temph应为unsigned int 变量
      return  (uint16_t)value;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    📝数据左右对齐数据转换综合实现

    **************************************************************************
     * 函数名:ADC_GetConversionValue
     * 描述  :获取ADC转换结果
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     *************************************************************************/
    uint16_t ADC_GetConversionValue(void)
    {
      uint16_t value=0;        
      uint8_t templ,temph ;                 // 定义templ存储低8位数据  temph存储高8位数据
      
      while(!(ADC_CSR & 0x80));           //等待转换完成
       
     if ((ADC_CR2 & 0x08) != 0) /* Right alignment */
     {
      templ = ADC_DRL;
      temph = ADC_DRH;                  //读取ADC转换  在左对齐和右对齐模式下 读取数据的顺序不同     
      value = (uint16_t)(templ + (uint16_t)(temph <<  (uint8_t)8)) ; //得到十位精度的数据 0--1024
     }
     else
    {//注意是10位的转换精度 value、temph应为unsigned int 变量
      temph = ADC_DRH;
      templ = ADC_DRL;  
      value = ((uint16_t)temph << 2 ) + (uint16_t)templ ; //得到十位精度的数据 0--1024	
     }
      return  (uint16_t)value;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    🛠IAR Option Bytes配置说明

    🔰由于stm8s903k3,AIN6通道在PD6引脚上,需要将串口功能映射到其他地方。否则,串口无法打印。

    • 🔨点击下面的Save保存格式后缀名位.obc格式。
      在这里插入图片描述
    • 📍在配置选项中的ST-LINK中勾选下面的选项并加载上面保存的.obc格式文件。
      在这里插入图片描述

    📑主程序代码

    
    /****************************************
     * 文件名  :main.c
     * 描述    :AD转换实验   
     * 程序现象:本程序通过初始化ADC的AIN6通道,将传感器的ADC值通过串口进行打印
     * 寄存器版本 
    
    *****************************************/
    
    /* Includes ------------------------------------------------------------------*/
    #include "clk_conf.h"
    #include "uart.h"
    #include "adc.h"
    
    /* Private defines -----------------------------------------------------------*/
    /* Private function prototypes -----------------------------------------------*/
    /* Private functions ---------------------------------------------------------*/
    
    void delay(u32 nCount)
    {
      /* Decrement nCount value */
      while (nCount != 0)
      {
        nCount--;
      }
    
    }
    
    
    int main(void)
    {
      /* Infinite loop */
    
      /*设置内部高速时钟16M为主时钟*/ 
      Clk_conf();  
      /* 串口初始化 */
      uart_conf();
      
      /* ADC模块初始化AIN0->PB6, AIN1->PB5,AIN2->PB4,AIN3->PD3,AIN4->PD5,AIN5->PD6*/
      ADC_conf(5);
      printf("\r\n:%s\r\n","Using STM8s903k3");
      while(1)
      {
          printf("ADC_value=%u\r\n",ADC_GetConversionValue());
          delay(0xffff);
          delay(0xffff);
          delay(0xffff);      
      }
    }
    
    #ifdef USE_FULL_ASSERT
    
    /**
      * @brief  Reports the name of the source file and the source line number
      *   where the assert_param error has occurred.
      * @param file: pointer to the source file name
      * @param line: assert_param error line source number
      * @retval : None
      */
    void assert_failed(u8* file, u32 line)
    { 
      /* User can add his own implementation to report the file name and line number,
         ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    
      /* Infinite loop */
      while (1)
      {
      }
    }
    #endif
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    📚程序源码

    链接:https://pan.baidu.com/s/1vdxOTbBcCYHYgUGTV41-lg 
    提取码:nzap
    
    • 1
    • 2
  • 相关阅读:
    window对象
    android 动画中插值器Interpolator详解
    C#实现二分查找算法
    Java中集合ArrayList、LinkedList以及HashMap常用容器详解及其区别
    Nginx 学习(八)Nginx实现用IP测试灰度发布
    干货分享——银行运维组织如何转向敏捷?
    D. Tournament Countdown(交互题)
    Mysql使用中的性能优化——索引数对插入操作性能的影响
    邬贺铨:因地制宜 数字化技术赋能“双碳”实践
    在fastapi中实现异步
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/128077003