ADC的初始化步骤:
1.初始化ADC所用的通道IO
2.开启ADC的时钟并初始化ADC的结构体
3.调用ADC_Cmd函数进行使能ADC,目的是可以进行读写ADC的寄存器
4.校准ADC(这一步不是必须的,校准ADC时ADC硬件会生成一个校准码,来减小测量误差,校准过的ADC比不校准的准确)
5.调用ADC_RegularChannelConfig写入规则通道的信息(包括写入SQR寄存器的值,采样时间等)
6.调用ADC_SoftwareStartConvCmd函数开启ADC采样
7.等待采样完成,并读取ADC数据
ADC部分代码如下:
#include "adc.h"
static void ADC_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜPB,PE¶Ë¿ÚʱÖÓ
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void ADC_Mode_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_GPIO_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel=ADC_Channel_1;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)==SET);
}
u16 ADC_STARTConver(void)
{
u16 adcconverdata;
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
adcconverdata=ADC_GetConversionValue(ADC1);
return adcconverdata;
}
main函数中执行如下循环
AdcConverValue=ADC_STARTConver();
printf("AdcConverValue=%d \r\n",AdcConverValue);
接下来就是执行结果了:
上面是我引脚悬空时候的结果,下图是测量0V时的图片:
值得注意的是ADC_Cmd这个命令,当把上面程序的ADC_SoftwareStartConvCmd(ADC1,ENABLE);命令更换为ADC_Cmd(ADC1,ENABLE);命令时程序仍然正常运行,原因如下:
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
assert_param(IS_ADC_ALL_PERIPH(ADCx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
ADCx->CR2 |= CR2_ADON_Set;
}
else
{
ADCx->CR2 &= CR2_ADON_Reset;
}
}
从上面的函数原型可以看出ADC_CMD函数设置的是CR2寄存器的ADON位
打开参考手册,找到这个位,解释如下:
从上图中我们可以看到,当该位为1时,再写入1的话则是启动ADC转换,而不是无效命令,我们程序在ADC初始化的时候已经调用过一次ADC_CMD函数,所以该位为1,所以当我们将ADC_SoftwareStartConvCmd(ADC1,ENABLE);函数更换为ADC_Cmd(ADC1,ENABLE)时,程序一点影响都没有,照常运行。
上一篇:STM32ADC转换中断读取
下一篇:Stm32f103rct6ADC电压采集简介及注意点
推荐阅读
史海拾趣
在20世纪末和21世纪初,APEM通过一系列收购和技术合作,不断增强自身的技术实力和市场竞争力。例如,APEM收购了丹麦的高性能PCB轻触开关制造商MEC,以及美国的开关面板制造商UNIFAB。这些收购不仅使APEM获得了先进的技术和知识产权,也为其在全球市场的竞争中赢得了先机。
通过以上五个故事,我们可以看到APEM公司在电子行业的发展历程中,始终坚持创新、扩张和合作的战略,不断壮大自身实力,成为行业内的佼佼者。
在20世纪末和21世纪初,APEM通过一系列收购和技术合作,不断增强自身的技术实力和市场竞争力。例如,APEM收购了丹麦的高性能PCB轻触开关制造商MEC,以及美国的开关面板制造商UNIFAB。这些收购不仅使APEM获得了先进的技术和知识产权,也为其在全球市场的竞争中赢得了先机。
通过以上五个故事,我们可以看到APEM公司在电子行业的发展历程中,始终坚持创新、扩张和合作的战略,不断壮大自身实力,成为行业内的佼佼者。
为了进一步丰富产品线,APEM在1984年开设了新厂,专业生产开关面板。这一举措不仅扩充了公司的产品种类,也满足了客户对多样化产品的需求。此后,APEM不断推出新产品,逐步形成了完善的开关和控制面板产品线。
DiCon Fiberoptics Inc公司成立于1986年,当时的光纤通信技术正处于快速发展阶段。公司创始人凭借对行业的敏锐洞察和坚定信念,决定投身于这一领域。在创业初期,公司面临着资金紧张、技术壁垒高等诸多挑战。然而,通过不懈努力和持续创新,DiCon成功研发出了多款高性能的光纤通信产品,逐渐在市场上获得了认可。
EUtech公司注重品牌塑造和市场拓展。他们通过参加国际展会、举办技术研讨会等方式提高品牌知名度。同时,公司积极拓展海外市场,产品已出口到新加坡、香港、韩国等国家和地区。凭借优异的产品质量和良好的市场口碑,EUtech公司逐渐在国际市场上树立起了品牌形象。
38、27m,sdram时钟线(80m-90m),这些时钟线二三次谐波刚好在vhf波段,从接收端高频窜入后干扰很大。除了缩短线长以外,还有那些好办法? 如果是三次谐波大,二次谐波小,可能因为信号占空比为50%,因为这种情况下,信号没有偶次谐波。这时需要修 ...… 查看全部问答∨ |
|
IP摄像机(标清)潜在优势 使用IP摄像机最突出的优势在于它可以直接把摄像机连接到IP网络或计算机网络上,而在模拟摄像机系统中则需要另外再增加一个计算机(通常是编码器或者DVR),因此,在某些情况下,使用IP网络能很大程度上减 ...… 查看全部问答∨ |
void CStyCString2ValueDlg::OnButton1() { char *s=\"123\", *stops; int i; //这三种方法无论在VC还是eVC均正常 i=strtol( ...… 查看全部问答∨ |
接上一贴:http://topic.eeworld.net/u/20100131/15/462e28c6-78c7-41aa-a2f8-02d643802276.html 我晕,又发现了一个不对的地方(应该是不正常的吧) #define _RAM_STARTADDRESS 0x30000000 #define _NONCACHE_STARTA ...… 查看全部问答∨ |
希望在北京找一个嵌入式开发工作,以上为我的工作经历: 姓名:李先生 手机:13810160217 现住地:北京石景山区 薪资:面谈 自我评价:工作踏实,认真,负责,为人诚实,正直 ...… 查看全部问答∨ |
$(\'swf_Spt\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMjcyNjgxNDUy/v.sw ...… 查看全部问答∨ |