STC8G1K08A单片机数模转换

本文详细介绍了STC8G1K08A单片机的ADC模块,包括其工作时钟频率、控制寄存器、配置寄存器、转换结果寄存器和时序控制寄存器的设置。通过示例代码展示了如何进行ADC初始化和转换,以及转换结果的计算方法。同时,提到了ADC的通道选择、采样时间和转换速度的配置选项,为实际应用提供了参考。

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

STC8G1K08A单片机内部集成了一个十位ADC模块.ADC的时钟频率为系统频率2分频在经过用户设置的分频系数在进行再次分频(ADC的工作时钟频率范围为SYSclk/2/1到SYSclk/2/16)

STC8G1K08A单片机ADC的相关寄存器如下图
在这里插入图片描述
一、ADC控制寄存器(ADC_CONTR),PWM触发ADC控制器
在这里插入图片描述
ADC_POWER: ADC电源控制位
0:关闭ADC电源
1:打开ADC电源
ADC_START: ADC转换启动控制位
0:无影响.即使ADC已经开始转换工作,写0也不会停止A/D转换
1:开始ADC转换,转换完成后硬件自动将此位清零
ADC_FLAG: ADC转换结束标志位
当ADC完成一次转换后,硬件会自动将此位置1,并向CPU提出中断请求。此标志位必须由软件清零
ADC_CHS[3:0]: ADC模拟通道选择位
STC8G1K08A-8PIN系列

ADC_CHS[3:0]ADC通道
0000P3.0/ADC0
0001P3.1/ADC1
0010P3.2/ADC2
0011P3.3/ADC3
0100P5.4/ADC4
0101P5.5/ADC5

二、ADC配置寄存器(ADCCFG)
在这里插入图片描述RESFMT: ADC转换结果格式控制位
0:转换结果左对齐。ADC_RES保存结果的高8位,ADC_RESL保存结果的低2位。格式如下:
在这里插入图片描述
1:转换结果右对齐。ADC_RES保存结果的高2位,ADC_RESL保存结果的低8位。格式如下:
在这里插入图片描述
SPEED[3:0] :设置ADC工作时钟频率{Fadc=SYSclk/2(SPEED+1)}

SPEED[3:0]给ADC的工作时钟频率
0000SYSclk/2/1
0001SYSclk/2/2
0010SYSclk/2/3
1101SYSclk/2/14
1110SYSclk/2/15
1111SYSclk/2/16

三、ADC转换结果寄存器(ADC_RES , ADC_RESL)
在这里插入图片描述
当A/D转换完成后,10位的转换结果会自动保存到ADC_RES和ADC_RESL中。保存结果的数据格式请参考ADC_CFG寄存器中的RESFMT设置。
四、ADC时序控制寄存器
在这里插入图片描述
CSSETUP: ADC通道选择时间控制 Tsetup

CSSETUP占用ADC工作时钟数
01(默认值)
12

CSHOLD[1:0]:ADC通道选择保持时间控制Thold

CSHOLD[1:0]占用ADC工作时钟数
001
012(默认值)
103
114

SMPDUTY[4:0]: ADC模拟信号采样时间控制Tduty(注意:SMPDUTY一定不能设置小于01010B)

SMPDUTY[4:0]占用ADC工作时钟数
000001
000012
0101011(默认值)
1111031
1111132

五、ADC转换结果计算公式
在这里插入图片描述
六、反推ADC输入电压计算公式
在这里插入图片描述
采用查询方式的ADC采样
1.配置寄存器参数

#define ADC_Power 0X85	   //宏定义   使能ADC模块     打开ADC   将ADC引脚设置到P5.5
#define ADC_Start 0X40	   //宏定义	  开始AD转换
#define ADC_Flag  0X20     //宏定义	  转换完成标志位
#define ADC_SYS   0X0F	   //宏定义   将ADC系统时钟设定为SYSclk/2/16

2.ADC初始化函数

/*ADC初始化函数*/
void Adc_Start()
{
	ADC_CONTR = ADC_Power;     	   //使能ADC模块     打开ADC   将ADC引脚设置到P5.5
	ADCCFG    = ADC_SYS;           //将ADC系统时钟设定为SYSclk/2/16
}

3.ADC转换函数

/*开启ADC转换函数*/
void Adc_ZhuanHuan()
{
	ADC_CONTR |= ADC_Start;           //开启AD转换
	_nop_();		                  //空指令
	_nop_();		                  //空指令
	while(!(ADC_CONTR & ADC_Flag));   //等待转换完成
	ADC_CONTR &=~ ADC_Flag;		      //清除完成标志位
}

4.计算结果(这里只使用8位)

Adc_ZhuanHuan();		//开启ADC转换
NUM = ADC_RES;			//将转换的值赋给NUM
temp = NUM*10*5/256;	//将转换后的数值进行计算  NUM*10*5/255
### STC8G1K08A 单片机输出 PWM 波方法 #### 使用 PCA 实现 PWM 输出 对于STC8G1K08A单片机而言,PCA(可编程计数器阵列)是一个重要的外设用于生成PWM信号。PCA的输入源可以选择系统时钟、定时器溢出脉冲以及ECI脚的外部输入时钟[^1]。 由于系统时钟固定不可调整,在不连接额外晶振的前提下,推荐选用内部定时器0产生的溢出脉冲作为PCA模块的时间基准来创建期望中的PWM频率。通过调节定时器重载值可以灵活改变最终得到的PWM周期从而达到设定的目标频率。例如要获得每秒钟仅触发一次(PWM频率=1Hz),则需配置定时器使其每隔大约977微秒发生一次中断并更新比较匹配寄存器内的数值以形成方波输出。 ```c // 初始化PCA模块, 设置为定时器模式 void Init_PCA(void){ // 配置PCA工作于定时器方式... } // 设定PWM占空比函数 void Set_PWM_Duty(unsigned char channel,unsigned int duty_cycle){ // 计算对应通道下的高电平持续时间,并写入相应的CCRnL/CCRnH寄存器中... } ``` 以上代码片段展示了初始化PCA模块以及设置特定PWM通道占空比的基本框架。实际应用过程中还需要根据具体需求进一步完善参数配置部分的内容。 为了更直观地理解整个过程,建议参考开源项目`https://gitcode.com/open-source-toolkit/00612`提供的实例程序,该项目详细介绍了基于STC8G1K08A实现三路PWM输出及其占空比渐变的具体做法[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值