STM8S_库函数_ADC模数转换电压采集

大家好,我是单片机爱好者-MCU起航。这一节我们介绍如何使用库函数方式控制STM8S103F3P6片上的ADC,也就是电压采集的功能。

ADC,又叫模数转换,是把模拟量转换为数字量,用于电压采集。是电路中非常常用的一个功能,像电池电压检测、传感器值检测等,用途是非常多的。

咱们看下数据手册中,对这部分功能的描述,截图如下:

可以看到,功能比较详细,包括:10位分辨率、单次和连续转换模式、可编程的预分频、外部中断触发、模拟放大(部分型号有)、转换结束中断、数据对其方式等等。

除此以外,还有扩展功能。咱们这里只看基本功能,扩展功能暂时不考虑。首先选择要演示用的管脚,如图所示:

选择地心一号上的PD2管脚,前面有两个分压电阻,把电池电压做了分压。防止电压过大,对管脚造成伤害。

这里补充一下,国内部分中文的数据手册把PD2上的AD功能写成了需要修改选项字才能修改,如下:

早期的数据手册,可能是翻译的问题,也可能是其它原因。导致手册里显示PD2的功能需要重映射才能使用。

但是英文原版手册里,并不是这样要求的,如图:

所以,数据手册尽量看原版的,这样有保证。接下来通过代码来演示。如下:

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "uart.h"
#include "adc_config.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {   
    nCount--;
  }
}
void main(void)
{
//  u16 u16_adc1_value;
  Uart1_Init();
  ADC_CONFIG();
  
  while (1)
  {    
  }
  
}

主函数里进行了三个操作:

1、串口初始化,采集到的电压要通过串口打印显示出来。

2、ADC初始化,具体代码稍后看。

3、原地等待。

然后我们看ADC初始化部分的代码:

#include "adc_config.h"
extern void Delay(uint16_t nCount);
void ADC_CONFIG(void)
{
  GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);
  ADC1_DeInit();
  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D10, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE);

/* Enable general interrupts */  
  ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
  enableInterrupts();
  Delay(500);
  ADC1_StartConversion();

}

这个函数里,先后进行了几个操作:

1、PD2初始化为浮空输入无中断。

2、ADC1相关寄存器恢复默认值。

3、ADC1初始化为连续转换模式、通道选择3、时钟10分频、外部触发转换事件关闭、数据右对齐、关闭指定通道的施密特触发器。

4、ADC转换完成中断使能。

5、开启全局中断。

6、延时一段时间,否则数据不准。

7、开始转换。

转换以后,数据从哪看?

刚才说了,是通过串口打印输出的。代码如下:

 INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
 {
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    u16 u16_adc1_value;
    unsigned char a = 0;
    u16_adc1_value = ADC1_GetConversionValue();
    a = u16_adc1_value>>8;
    UART1_SendByte(a);
    a = u16_adc1_value;
    UART1_SendByte(a);
    UART1_SendByte(0x11);
    ADC1_ClearFlag(ADC1_FLAG_EOC);

 }

这部分功能就比较简单了,读取转换结果,然后通过串口发送,然后清除中断标志。

编译、下载、上电,功能正常!

打完收工!

想要获取相关程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据