用到的引脚是pa3也就是adc1的通道3
1、adc的主要参数
a、分辨率----stm32f407的分辨率有6位、8位、10位、12位,参考电压如果是3.3 那么最小分辨率就是3.3/4095。
b、转换时间----stm32f407的最高允许频率是36m,最快转换时间 = 3+12个周期 =0.71us。
c、参考电压----2.4至3.3v。
2、工作过程分析
adc转换是把外面输入到引脚的电压值转换成数字信号,单片机里面有一个模拟至数字的转换模块,我们可以控制它采集引脚的电压,stm32f407可以利用void adc_softwarestartconv(adc_typedef* adcx)这个函数来控制转换。
3、详细的步骤
一、开启时钟 设置端口io
rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioa,enable);//使能gpioa时钟
rcc_apb2periphclockcmd(rcc_apb2periph_adc1,enable);//使能adc1时钟
/*端口设置为模拟输入*/
gpio_initstructure.gpio_mode = gpio_mode_an;/*模拟输入*/
gpio_initstructure.gpio_pin = gpio_pin_3;/*通道3*/
gpio_initstructure.gpio_pupd = gpio_pupd_nopull;/*-不带上下拉*/
gpio_init(gpioa,&gpio_initstructure);/*初始化*/
上面主要是设置了gpioa 和adc1的时钟,并且把pa3设置为模拟输入。
二、设置通用控制寄存器
adc_commoninitstructure.adc_dmaaccessmode = adc_dmaaccessmode_disabled;/*dma失能*/
adc_commoninitstructure.adc_mode = adc_mode_independent;/*独立模式*/
adc_commoninitstructure.adc_prescaler = adc_prescaler_div4;/*设置adc的频率为apb2/4 即84/4=21m*/
adc_commoninitstructure.adc_twosamplingdelay = adc_twosamplingdelay_5cycles;/*采样间隔时间*/
adc_commoninit(&adc_commoninitstructure);/*初始化*/
三、adc的初始化
adc_initstructure.adc_resolution = adc_resolution_12b;/*12位模式*/
adc_initstructure.adc_scanconvmode = disable;/*非扫描模式*/
adc_initstructure.adc_continuousconvmode = disable;/*关闭连续转换*/
adc_initstructure.adc_externaltrigconvedge = adc_externaltrigconvedge_none;/*禁止触发检测 使用软件触发*/
adc_initstructure.adc_dataalign = adc_dataalign_right;/*右对齐*/
adc_initstructure.adc_nbrofconversion = 1;/*只使用1通道 规则通为1*/
adc_init(adc1,&adc_initstructure);/*初始化*/
adc_cmd(adc1,enable);/*开启adc*/
到这里adc的设置基本完成现在就可以读取adc的值。
四、读取adc的值
uint16_t bsp_getadc(void)
{
adc_regularchannelconfig(adc1,adc_channel_3,1,adc_sampletime_480cycles);/*设置规则通道3 一个序列 采样时间 */
adc_softwarestartconv(adc1);/*启动软件转换*/
while(!adc_getflagstatus(adc1,adc_flag_eoc));/*等待转换结束*/
return adc_getconversionvalue(adc1);/*读取转换结果*/
}
这样我们就可以读取adc的值了,其中我们每次读取的时候都要重新启动adc的转换,转换完成就可以读取。
下面是完整的程序
/****************************************************************************************
*函 数 名:bsp_initadc
*函数功能:adc1的初始化
*形 参:无
*返 回 值:无
*****************************************************************************************/
void bsp_initadc(void)
{
gpio_inittypedef gpio_initstructure;
adc_commoninittypedef adc_commoninitstructure;
adc_inittypedef adc_initstructure;
rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioa,enable);//使能gpioa时钟
rcc_apb2periphclockcmd(rcc_apb2periph_adc1,enable);//使能adc时钟
/*初始化adc1通道3 的io口*/
gpio_initstructure.gpio_mode = gpio_mode_an;/*模拟输入*/
gpio_initstructure.gpio_pin = gpio_pin_3;/*通道5*/
gpio_initstructure.gpio_pupd = gpio_pupd_nopull;/*不带上下拉*/
gpio_init(gpioa,&gpio_initstructure);/*初始化*/
/*通用控制寄存器的配置*/
adc_commoninitstructure.adc_dmaaccessmode = adc_dmaaccessmode_disabled;/*dma失能*/
adc_commoninitstructure.adc_mode = adc_mode_independent;/*独立模式*/
adc_commoninitstructure.adc_prescaler = adc_prescaler_div4;/*apb2的4分频 即84/4=21m*/
adc_commoninitstructure.adc_twosamplingdelay = adc_twosamplingdelay_5cycles;/*两个采样阶段的延时5个时钟*/
adc_commoninit(&adc_commoninitstructure);/*初始化*/
/*初始化adc1*/
adc_initstructure.adc_resolution = adc_resolution_12b;/*12位模式*/
adc_initstructure.adc_scanconvmode = disable;/*非扫描模式*/
adc_initstructure.adc_continuousconvmode = disable;/*关闭连续转换*/
adc_initstructure.adc_externaltrigconvedge = adc_externaltrigconvedge_none;/*禁止触发检测 使用软件触发*/
adc_initstructure.adc_dataalign = adc_dataalign_right;/*右对齐*/
adc_initstructure.adc_nbrofconversion = 1;/*只使用1通道 规则通为1*/
adc_init(adc1,&adc_initstructure);/*初始化*/
adc_cmd(adc1,enable);/*开启adc*/
}
/****************************************************************************************
*函 数 名:bsp_getadc
*函数功能:读取通道3的值
*形 参:无
*返 回 值:adc的数字值
*****************************************************************************************/
uint16_t bsp_getadc(void)
{
adc_regularchannelconfig(adc1,adc_channel_3,1,adc_sampletime_480cycles);/*设置规则通道3 一个序列 采样时间 */
adc_softwarestartconv(adc1);/*启动软件转换*/
while(!adc_getflagstatus(adc1,adc_flag_eoc));/*等待转换结束*/
return adc_getconversionvalue(adc1);/*读取转换结果*/
}
/****************************************************************************************
*函 数 名:bsp_getadcvalue
*函数功能:读取通道3的值
*形 参:num转换次数
*返 回 值:adc的数字值
*****************************************************************************************/
uint16_t bsp_getadcvalue(uint8_t num)
{
uint16_t temp = 0;
uint16_t t;
for(t = 0;t 《 num;t++)
{
temp +=bsp_getadc();/*求平均值*/
}
return temp/num;
}
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
/*
st固件库中的启动文件已经执行了 systeminit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
配置cpu系统的时钟,内部flash访问时序,配置fsmc用于外部sram
*/
bsp_init();//在这里对adc1进行了初始化及其它相关的初始化
/* 进入主程序循环体 */
while (1)
{
printf(“%d ”, bsp_getadcvalue(10));
bsp_delayms(1000);
}
}
通过串口我们可以看到数据的变化。
你不知道的Linux有名管道(FIFO)的阻塞和非阻塞读写
高空测报灯的应用场景及其使用效果的详细讲解
iPhone 8将改名iPhone X?iPhone8将配备5.8寸OLED显示屏?
为什么LED内不集成限流电阻呢?
自顶向下和逐步求精
如何实现STM32F407单片机的ADC转换
使用联合学习桥接金融服务中的数据孤岛
智能余压报警系统是否需要与其他防火设备和建筑智能化系统集成?
最新48Gbps的HDMI连接线缆即将上市
FAST的建成使天体发出的电磁波优于10毫米的设计标准?
DJI会陆续变更部分产品制式,可通过更新固件实现FCC制式变更
Gartner 2019曲线5大趋势:“超能人类”将出现,自动机器人普及
Aldec公司推出HES-HPC-DSP-KU115 FPGA加速板卡
新思科技采用VCS 与 Verdi 结合,推出与众不同的芯片设计
上汽通用五菱全球小型纯电动车销量突破 30 万辆
如何组装无线PS2遥控器4WD机器人车载套件
北京启动首个AI产业方向创新应用平台
爱国者EROSK评测 在HIFI音质和实用性上的表现都不错
数字化转型及其通过能量收集在物联网可持续性中的作用
钒电池(VRB)基础知识