小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【STM8教程-08】ADC模数转换器的原理与应用

项目案例:采样并换算光敏电阻的电压值

硬件资源:ADC的第12通道,串行接口。
光敏电阻 ——–> PF4/ADC12。
串行接口UART2。
硬件电路相关信息,详见:XMF06A开发的电路结构框图

功能要求
1. 系统的主时钟采用默认的高速内部振荡器8分频,即2MHz
2. 串行接口UART2的波特率为9600BSP,1位起始位,8位数据位,1位停止位。
3. 串口的数据发送采用查询方式,串口数据的接收采用中断方式
4. 初始化ADC模数转换器,对12通道进行单次转换,采样结果数据左对齐,其他参数配置保持默认
5. 每次采样完毕之后,进行电压值的换算,采样精度10位,参考电压3.3V,单位为mV
6. 将换算后的电压值格式成字符串“电压值:xxxx mV”,回车换行。
4. 系统上电开机后,首先向上位机发送字符串“小蜜蜂笔记网 www.xmf393.com 欢迎您!”,回车换行。
6. 在主函数中轮询控制命令字变量,当收到上位机的单字节命令0xa3,则进行一次光敏电阻的电压采样和换算,并把采样结果以字符串的形式上传至上位机。

案例的参考源码及注释

#include "iostm8s105k6.h"
#include "stdio.h"

unsigned char Recv_dat = 0;  
unsigned int dat_ADC12, dat_Volt;

/*=======================串口UART2初始化=========================*/
void Init_UART2()
{
  asm("rim");                   //打开总中断
  //在默认的2MHz时钟源下,波特率:9600
  //UART_DIV = 2000000/9600 = 208 = 0x0d00
  UART2_BRR2 = 0x00;            //必须先写BRR2 
  UART2_BRR1 = 0x0d;            //再写BRR1 
  UART2_CR2 = 0x2c;             //允许接收和发送,使能接收中断 
  asm("rim");                   //打开总中断
}

/*=====================串口发送单字节函数========================*/
void UR2_Send_Byte(unsigned char dat)
{
  while((UART2_SR & 0x80)==0x00);  
  UART2_DR = dat;               //发送一个字节
}

/*======================串口发送字符串函数=======================*/
void UR2_Send_String(unsigned char *str )
{
  while(*str != '\0')           //发送一个字符串
  {
    UR2_Send_Byte(*str++);      //逐个发送字符串中的字节
  }
}

/*====================UART2接收中断服务函数======================*/
#pragma vector= UART2_R_OR_vector
__interrupt void UART2_R_OR_IRQHandler()  
{
  Recv_dat = UART2_DR;          //将接收到的数据读取出来
}

/*======================ADC12初始化函数==========================*/
void Init_ADC12()
{
  ADC_CSR_CH = 12;              //选择通道AIN12
  ADC_CR1_ADON = 1;             //首次将ADON位置1,唤醒
}

/*=================ADC数据采样与换算函数=========================*/
void Read_ADC12()
{
  ADC_CR1_ADON = 1;             //启动ADC转换
  while(ADC_CSR_EOC == 0);      //等待转换完成
  ADC_CSR_EOC = 0;              //清除转换完成标志
  
  dat_ADC12 = ADC_DRH;          //数据左对齐
  dat_ADC12 = (dat_ADC12 << 2) | ADC_DRL;
  //参考电压3.3V,10位的分辨率为:3300 / 1024 = 3.22mv
  dat_Volt = dat_ADC12 * 32 / 10;
}

/*=====================ADC采样信息上传函数=======================*/
void Send_ADC_Info()
{
  unsigned char buf[32];        //字符串格式化缓存
  Read_ADC12();                 //进行ADC数据采样,电压换算
  sprintf(buf, "电压值: %4dmV\r\n",dat_Volt);
  UR2_Send_String(buf);         //上传电压信息字符串
}

/*===========================主函数==============================*/
void main()
{
  Init_UART2();                 //初始化UART2
  Init_ADC12();                 //初始化ADC
  UR2_Send_String("小蜜蜂笔记网 www.xmf393.com 欢迎您!\r\n");
  while(1)
  {
    if(Recv_dat == 0xa3)        //如果接收到的数据为0xa3命令字
    {
      Send_ADC_Info();          
      Recv_dat = 0;             //清除命令字变量
    }
  }
}
赞(3)
未经允许不得转载:小蜜蜂笔记 » 【STM8教程-08】ADC模数转换器的原理与应用

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店