专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
STM32F429 ADC 结果超过4096
2019-07-14 13:26
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
10020
7
1482
诸君:
使用
STM32
F429,选择ADC1 PA0作为输入。
所得结果都是大于4096,求解!
另外,试了下将结果与0x0fff,屏蔽最高4位,得出了正确结果,这个是什么道理?
程序都是按照 原子F407 的程序对照修改的。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
naiztycheng
1楼-- · 2019-07-14 18:10
精彩回答 2 元偷偷看……
加载中...
nyvvhxcs
2楼-- · 2019-07-14 21:06
没遇到过,,,,
加载中...
TOPCB
3楼-- · 2019-07-15 01:16
楼主把配置代码发一下。读取AD结果的代码也发一下。
加载中...
saber_miku
4楼-- · 2019-07-15 01:23
/**
* @brief ADC1 Init
* @param None
* @retval None
*/
void stm32f4xx_ADC1_Init(void)
{
/*【Step 1:定义结构体】↓----------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
/*【Step 1:结束】↑---------------------------------------------------------*/
/*【Step 2:开启PA口时钟和ADC1时钟,设置PA0为模拟输入】↓----------------------*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
/*【Step 2:结束】↑---------------------------------------------------------*/
/*【Step 3:ADC1复位】↓-----------------------------------------------------*/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
/*【Step 3:结束】↑---------------------------------------------------------*/
/*【Step 4:设置ADC的CCR,配置ADC输入时钟分频,模式为独立模式等】↓------------*/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/*【Step 4:结束】↑---------------------------------------------------------*/
/*【Step 5:初始化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初始化
/*【Step 5:结束】↑---------------------------------------------------------*/
/*【Step 6:开启AD转换器】↓-------------------------------------------------*/
ADC_Cmd(ADC1, ENABLE);
/*【Step 6:结束】↑---------------------------------------------------------*/
}
/**
* @brief 获得ADC值
* @param ADC_Channel
* @retval ADC一次转换结果数据
*/
uint16_t Get_ADC(uint8_t ADC_Channel)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_480Cycles);
ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))//等待转换结束
{
}
return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
}
/**
* @brief 获取通道ADC_Channel的转换值,取times次,然后平均
* @param ADC_Channel,times
* @retval 平均值
*/
uint16_t Get_ADC_Average(uint8_t ADC_Channel,uint8_t times)
{
uint32_t sum=0;
uint8_t n;
for(n=0;n<times;n++)
{
sum+=Get_ADC(ADC_Channel);
Delay_ms(5);
}
return sum/times;
}
加载中...
saber_miku
5楼-- · 2019-07-15 02:47
TOPCB 发表于 2019-3-26 15:52
楼主把配置代码发一下。读取AD结果的代码也发一下。
谢谢,程序贴在9楼。
加载中...
saber_miku
6楼-- · 2019-07-15 03:51
精彩回答 2 元偷偷看……
加载中...
1
2
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
* @brief ADC1 Init
* @param None
* @retval None
*/
void stm32f4xx_ADC1_Init(void)
{
/*【Step 1:定义结构体】↓----------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
/*【Step 1:结束】↑---------------------------------------------------------*/
/*【Step 2:开启PA口时钟和ADC1时钟,设置PA0为模拟输入】↓----------------------*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
/*【Step 2:结束】↑---------------------------------------------------------*/
/*【Step 3:ADC1复位】↓-----------------------------------------------------*/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
/*【Step 3:结束】↑---------------------------------------------------------*/
/*【Step 4:设置ADC的CCR,配置ADC输入时钟分频,模式为独立模式等】↓------------*/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/*【Step 4:结束】↑---------------------------------------------------------*/
/*【Step 5:初始化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初始化
/*【Step 5:结束】↑---------------------------------------------------------*/
/*【Step 6:开启AD转换器】↓-------------------------------------------------*/
ADC_Cmd(ADC1, ENABLE);
/*【Step 6:结束】↑---------------------------------------------------------*/
}
/**
* @brief 获得ADC值
* @param ADC_Channel
* @retval ADC一次转换结果数据
*/
uint16_t Get_ADC(uint8_t ADC_Channel)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_480Cycles);
ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))//等待转换结束
{
}
return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
}
/**
* @brief 获取通道ADC_Channel的转换值,取times次,然后平均
* @param ADC_Channel,times
* @retval 平均值
*/
uint16_t Get_ADC_Average(uint8_t ADC_Channel,uint8_t times)
{
uint32_t sum=0;
uint8_t n;
for(n=0;n<times;n++)
{
sum+=Get_ADC(ADC_Channel);
Delay_ms(5);
}
return sum/times;
}
谢谢,程序贴在9楼。
一周热门 更多>