STM8S系列基于STVD开发ADC采样示例

STM8S系列基于STVD开发ADC采样示例


✨本工程以上面一篇的工程为模板,在此基础上实现ADC电压采样。

  • 🎬📽🎞工程编译和烧录以及调试信息过程演示:
    在这里插入图片描述

🛠功能说明

📝本案例采用ADC单次采样模式,本示例代码提供不同精度的采集方式,根据需求选择对应的接口函数。
  • ✅通道和引脚映射关系
AIN0---->PB6
AIN1---->PB5
AIN2---->PB4
AIN3---->PD3
AIN4---->PD5
AIN5---->PD6

  • ⚡需要注意的是当选择通道AIN5时,需要重新映射串口端口。串口发送引脚和通道5都在一个引脚。当使能了通道5后,如果串口不重新映射将无法打印信息。
    在这里插入图片描述

  • 🔨映射方法:(将串口映射到PF4,PA3引脚上)

  • 在这里插入图片描述

  • 🍁数据对齐
    在这里插入图片描述
    ● 🔰在左对齐模式下,先读高位字节寄存器(ADC_DRH),再读低位字节寄存器(ADC_DRL)。
    ● 🔰在右对齐模式下,先读低位字节寄存器(ADC_DRL),再读高位字节寄存器(ADC_DRH) 。

🎉此时,用户也可以选择使用LDW指令来读取整个ADC_DR,因为该指令和右对齐模式采用同样的读取顺序。

  • 🛠不同对齐方式数据转换合成代码实现

u16 ReadVol_CH3( void )
{
u16 voltage = 0;

	if( ADC_flag )
	{
	ADC_flag = 0;
	if ((ADC_CR2 & 0x08) != 0) /* Right alignment */
  {
		voltage = (uint16_t)(DATAL + (uint16_t)(DATAH <<  (uint8_t)8)) ; 
	}
	else
	{
	  voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024	
	}
	ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1,
	};
	return voltage;
}

📚ADC功能介绍

🔖STM8S903K3/F3系列产品包含10位逐次逼近A /D转换器(ADC1),具有多达7个外部和1个内部多路输入通道.

  • 输入电压范围:0 ~ VDD
  • 转换时间:14个时钟周期
  • 单、连续和缓冲连续转换模式
  • 缓冲区大小(n x 10位),其中n =输入通道数
  • 扫描模式,用于单个和连续转换一个频道序列
  • 模拟看门狗能力,具有可编程上下限阈值
  • AIN7通道上的内部参考电压
  • 模拟看门狗中断
  • 外部触发输入
  • 从TIM1 TRGO触发
  • 转换结束中断
    在这里插入图片描述

📓工程架构

  • 🍁采用模块化设计
    在这里插入图片描述

📖主程序代码实现

🌿采集的引脚是PD3,AIN4的电压值。

void main()
{

	unsigned int VALUE;
	CLK_CKDIVR = 0x00;		//主频16MHz
	_asm("SIM");
	GPIO_Init();
	ADC_GPIO_Init();
	UART1_Init(115200);
	Init_Timer5();
		_asm("RIM");
	while (1)
	{
		TIM_Delay_ms( 800);
		ADC_CH_Init(3);
		if(ADC_flag == 1)
		{
	//	VALUE = ADC1_GetConversionValue();//8bit精度adc
			VALUE = ReadVol_CH3();//10bit精度
		My_print_Information_uint("ADC_Value= ", VALUE);
		ADC_flag = 0; // ADC中断标志 置0
	  }
	}
}	
  • 📋中断号
    在这里插入图片描述
struct interrupt_vector const _vectab[] = {
	{0x82, (interrupt_handler_t)_stext}, /* reset */
	{0x82, NonHandledInterrupt}, /* trap  */
	{0x82, NonHandledInterrupt}, /* irq0  */
	{0x82, NonHandledInterrupt}, /* irq1  */
	{0x82, NonHandledInterrupt}, /* irq2  */
	{0x82, NonHandledInterrupt}, /* irq3  */
	{0x82, NonHandledInterrupt}, /* irq4  */
	{0x82, NonHandledInterrupt}, /* irq5  */
	{0x82, NonHandledInterrupt}, /* irq6  */
	{0x82, NonHandledInterrupt}, /* irq7  */
	{0x82, NonHandledInterrupt}, /* irq8  */
	{0x82, NonHandledInterrupt}, /* irq9  */
	{0x82, NonHandledInterrupt}, /* irq10 */
	{0x82, NonHandledInterrupt}, /* irq11 */
	{0x82, NonHandledInterrupt}, /* irq12 */
	{0x82, TIM5_UPD_OVF_IRQHandler}, /* irq13 */
	{0x82, NonHandledInterrupt}, /* irq14 */
	{0x82, NonHandledInterrupt}, /* irq15 */
	{0x82, NonHandledInterrupt}, /* irq16 */
	{0x82, NonHandledInterrupt}, /* irq17 */
	{0x82, UART1_Receive_Interrupt}, /* irq18 */
	{0x82, NonHandledInterrupt}, /* irq19 */
	{0x82, NonHandledInterrupt}, /* irq20 */
	{0x82, NonHandledInterrupt}, /* irq21 */
	{0x82, ADC_Handle}, /* irq22 */
	{0x82, NonHandledInterrupt}, /* irq23 */
	{0x82, NonHandledInterrupt}, /* irq24 */
	{0x82, NonHandledInterrupt}, /* irq25 */
	{0x82, NonHandledInterrupt}, /* irq26 */
	{0x82, NonHandledInterrupt}, /* irq27 */
	{0x82, NonHandledInterrupt}, /* irq28 */
	{0x82, NonHandledInterrupt}, /* irq29 */
};
  • 📑ADC数据合成

u16 ReadVol_CH3( void )
{//10BIT精度adc
u16 voltage = 0;
	if( ADC_flag )
	{
	ADC_flag = 0;
	voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
	ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1,
	};
	return voltage;
}

✅工程源码

链接:https://pan.baidu.com/s/179Hjd-OGmSUzaprnd5aVSA 
提取码:xil8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值