学习KEA之ADC之二:查询方式

本文详细介绍了KEA微控制器的ADC模块配置与使用方法,包括时钟初始化、GPIO设置、ADC初始化及读取通道数据的过程。通过具体实例,展示了如何将ADC结果转换为mV,并对比了10位与12位模式下的精度差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:曾Jerry 或 大橙员, 250359225@qq.com

学习KEA之ADC之一:基本介绍
学习KEA之ADC之二:查询方式
学习KEA之ADC之三:中断方式
学习KEA之ADC之四:FIFO

需求:

  • 读取AD7(PTB3), AD12(PTF4), AD14(PTF6),并转换成 mV, 范围是0 - 5000mV,这三个输入都是电压大概是2.157V, 2.146V, 2.144V。

  • 基本配置:时钟来自bus_clock, 20MHz, Single模式, Software trigger,10-bit mode operation

例程:

#include "derivative.h" /* include peripheral declarations SSKEAZN64M2 */

void Clk_Init(void);

uint32_t adcResultInMv7 = 0;
uint32_t adcResultInMv12 = 0;
uint32_t adcResultInMv14 = 0;

int main(void)
{
	Clk_Init();
	init_ADC();

	adcResultInMv7 = ADC_Read(7);
	adcResultInMv12 = ADC_Read(12);
	adcResultInMv14 = ADC_Read(14);

	for(;;)
	{

	}

	return 0;
}


/***********************************************************************************************
*
* @brief    CLK_Init - Initialize Core Clock to 40MHz, Bus Clock to 20MHz
* @param    none
* @return   none
*
************************************************************************************************/
void Clk_Init(void)
{
	ICS_C1|= ICS_C1_IRCLKEN_MASK; /* Enable the internal reference clock*/
	ICS_C3 = 0x50; /* Reference clock frequency = 31.25 kHz*/

	while(!(ICS_S & ICS_S_LOCK_MASK)); /* Wait for PLL lock, now running at 40 MHz (1024*39.0625 kHz) */

	ICS_C2 |= ICS_C2_BDIV(1) ; /* BDIV=b001, Bus clock = 20 MHz*/
	ICS_S |= ICS_S_LOCK_MASK ; /* Clear Loss of lock sticky bit */
}

void init_GPIO(void)
{
	GPIOA_PDDR |= 1<<PTD2; /* Port D2: Data Direction= output */
	GPIOA_PIDR &= 1<<PTD2; /* Port D2: Input Disable= 1 (default) */
}

void init_ADC(void)  {
  SIM_SCGC |= SIM_SCGC_ADC_MASK; /* Enable bus clock in ADC*/
  ADC_SC3 |= ADC_SC3_ADICLK(0b00); /* Bus clock selected, 20 MHz*/
  ADC_SC2 |= 0x00; /* Software Conversion trigger, disable compare function*/
  ADC_SC2 |= ADC_SC2_REFSEL(0b01); /* Select VDD and VSS as voltage reference source*/
  ADC_SC1 = 0 ; /* Enable ADC by setting ADCH bits as low*/
  ADC_SC1 &= ~ADC_SC1_ADCO_MASK; /* Single mode operation */
  ADC_APCTL1 |= ADC_APCTL1_ADPC(1<<7 | 1<<12 | 1<<14); /* Channel selection */
  ADC_SC3 |= ADC_SC3_MODE(0b01); /* 10-bit mode operation */
}

uint32_t ADC_Read(char channel)
{
	ADC_SC1 &= ~ADC_SC1_ADCH_MASK;         /* Clear any prior ADCH bits*/
	ADC_SC1 |= ADC_SC1_ADCH(channel);      /* Select channel to read */
	while(!(ADC_SC1 & ADC_SC1_COCO_MASK)); /* Wait conversion to complete */

	//return ADC_R;
	return (uint32_t) ((5000*ADC_R)/0x3FF);  /* Convert result to mv for 0-5V range */
}

上面程序的仿真结果如下:
在这里插入图片描述
如果启用12位的ADC采样,结果就更准确了:

void init_ADC(void)  {
  SIM_SCGC |= SIM_SCGC_ADC_MASK; /* Enable bus clock in ADC*/
  ADC_SC3 |= ADC_SC3_ADICLK(0b00); /* Bus clock selected, 20 MHz*/
  ADC_SC2 |= 0x00; /* Software Conversion trigger, disable compare function*/
  ADC_SC2 |= ADC_SC2_REFSEL(0b01); /* Select VDD and VSS as voltage reference source*/
  ADC_SC1 = 0 ; /* Enable ADC by setting ADCH bits as low*/
  ADC_SC1 &= ~ADC_SC1_ADCO_MASK; /* Single mode operation */
  ADC_APCTL1 |= ADC_APCTL1_ADPC(1<<7 | 1<<12 | 1<<14); /* Channel selection */
  ADC_SC3 |= ADC_SC3_MODE(0b10); /* 12-bit mode operation */
}

uint32_t ADC_Read(char channel)
{
	ADC_SC1 &= ~ADC_SC1_ADCH_MASK;         /* Clear any prior ADCH bits*/
	ADC_SC1 |= ADC_SC1_ADCH(channel);      /* Select channel to read */
	while(!(ADC_SC1 & ADC_SC1_COCO_MASK)); /* Wait conversion to complete */

	//return ADC_R;
	return (uint32_t) ((5000*ADC_R)/0xFFF);  /* Convert result to mv for 0-5V range */
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值