大家好,我是单片机爱好者-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、数据手册等所有相关资料。