历史上的今天
今天是:2025年03月04日(星期二)
2020年03月04日 | STM8L ADC功能
2020-03-04 来源:eefocus
STM8L系列单片机集成了AD功能,有一个ADC模块,但是有最多可达28个AD通道,可以配置为单次采样或者连续采样。
ADC的精度最多可配置为12位精度,另外可以选择6位、8位、10位的精度。
下面举例初始化一个ADC的配置函数:
void ADC21Conver_Init()
{
ADC_ChannelCmd(ADC1,
ADC_Channel_0, //关闭其他的采样通道
DISABLE);
ADC_Cmd(ADC1 , DISABLE); //关闭ADC
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1 , ENABLE); //使能ADC1时钟
GPIO_Init(GPIOD , GPIO_Pin_1 , GPIO_Mode_In_FL_No_IT); //配置AD引脚
ADC_Init(ADC1,
ADC_ConversionMode_Single, //单次转换模式
ADC_Resolution_12Bit, //12位精度转换精度
ADC_Prescaler_1 //时钟设置为1分频
);
ADC_ChannelCmd(ADC1,
ADC_Channel_21, //设置为通道21进行采样
ENABLE);
ADC_Cmd(ADC1 , ENABLE); //使能ADC
}
因为只有一个ADC,所以在配置之前需要先之前使用的其他的AD通道,这里如果不关闭之前使用的AD通道的话,无法打开新的AD采集通道。
ADC可以选择时钟为1分频或者2分频,可以选择采样精度和采样方式。
下面列举一个读取ADC采样结果的函数:
void ADC_Data_Read(unsigned int *AD_Value)
{
ADC_SoftwareStartConv(ADC1); //启动ADC
while(ADC_GetFlagStatus(ADC1 , ADC_FLAG_EOC) == 0); //等待转换结束
ADC_ClearFlag(ADC1 , ADC_FLAG_EOC); //清除中断标志
*AD_Value = ADC_GetConversionValue(ADC1); //读取ADC1,通道1的转换结果
}
使用上面两个函数即可实现ADC采样功能,但是有个地方很奇怪,每次采集ADC值的时候第一次采集到的数据都是不准确的,所以第一次采集到的值是不能使用的。
另外STM8L内部还提供了1.2V的参考电压,但是在使用这个参考电压的时候有一些不稳定的现象。
比如在采集这个参考电压时,如果在读取函数前面加延时,延时的时间不一样得到的采样结果是不一样的,另外,这个参考我根据外面提供的VCC作为参考电压来计算的话,得到的值也不是1.2V,这个地方不知道是我的配置出了问题还是这个参考电压本身有问题。
史海拾趣
|
大事化小,成功一点点做起 我是搞工程的,我自己在做事的时候喜欢把任务分为许多块,没完成一个就有一次成就感,这样愉快的进行下一个目标。我平时也训练自己的这方面的能力,比如每天做俯卧撑20个,抄写古文等,目前已经抄写过《论语》,《孙子兵 ...… 查看全部问答> |
|
问题描述: 1.一个流式驱动,工作流程是硬件触发一个中断,系统采集到数据信息后通过xxx_READ将采集到的数据发给应用层; 2.驱动通过一个线程函数来获取GPIO的中断信号,并读取值从打印信息打印出。 (这里的处理正常,有多少中断都接受到,并且 ...… 查看全部问答> |
|
我在微软的网站下载的示例程序Pocket Access Demo,模拟器下运行没有任何问题,但是导到pda上总是提示未处理的“System.Runtime.InteropServices.ExternalException”类型的异常出现在 InTheHand.AdoceNet.dll 中。 其他信息: -2147024809 而且我 ...… 查看全部问答> |
|
用SAMSUNG的2440A做导航终端,400M主频,CPU发热严重,板子和机壳都很烫热.各位有什么好办法可以使CPU降温?看到别人的导航仪亦热,略感欣慰,非我独有啊!… 查看全部问答> |




