[STM32F1]

STM32基础篇——————ADC printf打印

[复制链接]
1794|17
手机看帖
扫描二维码
随时随地手机跟帖
aizaixiyuanqian|  楼主 | 2017-12-26 19:41 | 显示全部楼层 |阅读模式
本帖最后由 aizaixiyuanqian 于 2017-12-26 19:43 编辑

本次试验我们将利用 STM32的 ADC1 通道 1 来采样外部电压值,并将采集到的电压数据通过 printf 打印输出在串口助手上 。试验目标:
掌握 STM32 的内部 ADC 的操作方式



aizaixiyuanqian|  楼主 | 2017-12-26 19:42 | 显示全部楼层
本帖最后由 aizaixiyuanqian 于 2017-12-26 19:44 编辑

STM32  内部 ADC  的简介
STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测入电压是否超出用户定义的高/低阀值。STM32F103 系列最少都拥有 2 个 ADC,我们选择的 STM32F103ZET 包含有 3 个 ADC。
STM32 的 ADC 最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期为 1.5 个 ADC 时钟下得到),不要让 ADC 的时钟超过 14M,否则将导致结果准确度下降。STM32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。

使用特权

评论回复
xinxianshi| | 2017-12-26 19:45 | 显示全部楼层
这个容易实现,主要初始化的时候要初始化ADC,另外还有 初始化串口,然后用printf函数打印消息。

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 19:46 | 显示全部楼层
STM32 的 ADC 在单次转换模式下,只执行一次转换,该模式可以通过 ADC_CR2 寄存器的 ADON 位(只适用于规则通道)启动,也可以通过外部触发启(适用于规则通道和注入通道),这是 CONT 位为 0。以规则通道为例,一旦所选择的通道转换完成,转换结果将被存在 ADC_DR 寄存器中,EOC(转换束)标志将被置位, 如果设置了 EOCIE,则会产生中断。然后 ADC 将停止,直到下次启动。

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 19:47 | 显示全部楼层
xinxianshi 发表于 2017-12-26 19:45
这个容易实现,主要初始化的时候要初始化ADC,另外还有 初始化串口,然后用printf函数打印消息。 ...

对啊,挺好实现的。

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 20:04 | 显示全部楼层
ADC库函数
1.  开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
2.  设置 GPIO  口的模式
在做为 ADC 输入的时候,GPIO 口应该配置为是:模拟输入GPIO_Mode_AIN
3.  设置 ADC  时钟分频
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
4.  接着进行 ADC  模式的初始化。
5.  开启 ADC  使能
ADC_Cmd(ADC1, ENABLE);
6.  复位 ADC  校准,然后检测复位 ADC  校准是否完成
ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取 ADC 重置校准寄存器的状态
7.  开启 ADC  校准,然后等待 ADC  校准开启成功。
ADC_StartCalibration(ADC1);//开始指定 ADC 的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定 ADC 的校准程序
8.  设置采样周期和选择通道
用 ADC_RegularChannelConfig()函数

9.  开始转换。
使用的是软件触发功能,所以要软件开启转换。
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的 ADC1 的软件转换功能
10.  等待转换完成,并读取转换结果。
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
读取转换结果可以使用 ADC_GetConversionValue()函数,它返回最后一 次规则转换结果


使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 20:12 | 显示全部楼层
电路设计
QQ截图20171226201203.png

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 20:13 | 显示全部楼层
初始化例程void adc_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 最大 14M 设置 ADC 时钟(ADCCLK)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取 ADC 重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定 ADC 的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定 ADC 的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的 ADC 的软件转换启动功能
}



使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 20:15 | 显示全部楼层
主程序
int main()
{
u32 ad=0;
u8 i;
adc_init();  //ADC 初始化
printf_init(); //printf 初始化
while(1)
{
ad=0;
for(i=0;i<50;i++)//读取 50 次的 AD 数值取其平均数较为准确
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
ad=ad+ADC_GetConversionValue(ADC1);//返回最近一次 ADCx 规则组的转换结

}
ad=ad/50;
printf("ad=%fV\n",ad*3.3/4096);
delay_ms(1000);
}
}

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 20:17 | 显示全部楼层
串口输出代码的情况
QQ截图20171226201658.png

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-26 20:17 | 显示全部楼层
好了今天就到这里。

使用特权

评论回复
暖贴

使用特权

评论回复
pklong| | 2018-2-5 22:28 | 显示全部楼层
怎么配置printf

使用特权

评论回复
touser| | 2018-2-5 22:28 | 显示全部楼层
楼主代码呢

使用特权

评论回复
pklong| | 2018-2-5 22:29 | 显示全部楼层
printf和串口怎么关联的?

使用特权

评论回复
touser| | 2018-2-5 22:29 | 显示全部楼层
aizaixiyuanqian 发表于 2017-12-26 20:17
串口输出代码的情况

工程文件也没有看到啊。

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2018-2-6 19:11 | 显示全部楼层
touser 发表于 2018-2-5 22:29
工程文件也没有看到啊。

一起上传哈

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2018-2-6 19:11 | 显示全部楼层
pklong 发表于 2018-2-5 22:29
printf和串口怎么关联的?

添加映射即可

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝