OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5151|回复: 4

STM32F103RCT6的AD值在0xFF,0x1FF,0x3FF上的问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-4-22
在线时间
0 小时
发表于 2015-6-12 15:53:50 | 显示全部楼层 |阅读模式
5金钱
有一项目使用了SMT32F103RCT6这款单片机,发现AD采样时存在这个问题:
AD值在0xFF,0x1FF,0x3FF这三个点时,存在跳变的问题。
当获取的AD到0xFF时,采样点电压上升,但AD一直都是0xFF。直到电压上升到一定程度后,获得的AD值直接增加到了0x10E
同样的在0x1FF,和0x3FF也存在这个现像
不知道大家有没有发现这个问题,怎么解决
使用的是PC0(通道10),没有使用DMA

最佳答案

查看完整内容[请看2#楼]

好像找到问题点,频率高了 RCC_ADCCLKConfig(RCC_PCLK2_Div6); 再测试看看
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2015-6-12 15:53:51 | 显示全部楼层
好像找到问题点,频率高了
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

再测试看看
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2015-6-12 16:28:55 | 显示全部楼层
贴上代码

void ADCinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
ADC_InitTypeDef ADC_InitStructure; //定义ADC初始化结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能各个端口时钟,重要!!!
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);   //使能DMA1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //将外部AD输入挂接到引脚上
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //设置PC0引脚为模拟输入
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据参数配置GPIOC端口

   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; //设置转换序列长度为1
   ADC_Init(ADC1, &ADC_InitStructure); //根据参数初始化ADC1寄存器

//  ADC_RegularChannelConfig(ADC1,ADC_Channel_12, 1, ADC_SampleTime_55Cycles5);
//采样时间等于 55.5  周期
//   ADC_DMACmd(ADC1, ENABLE); //使能 ADC1 DMA 请求
  
   ADC_Cmd(ADC1, ENABLE); //使能ADC1

   ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器 

  while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC重置校准寄存器的状态

   ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
 //  while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC的校准状态
 //    
 //  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件转换
}


uint16 TestAdc1_10(void)  //ADC1通道10
{
uint8 i;
uint32  temp = 0; 
uint16  adc=0;
ADC_RegularChannelConfig(ADC1, 10, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道10,规则采样顺序值为1,采样时间为239.5周期        
for(i=0; i<3; i++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //试验 
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位 
adc=ADC_GetConversionValue(ADC1);
temp += adc;
}
// adc=(u16)((3300*adc)/4096);//(u16)adc_num2;
return temp/3;//返回最近一次ADCx规则组的转换结果  
}
回复

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-5-14
在线时间
6 小时
发表于 2015-6-12 16:36:39 | 显示全部楼层
楼主注释的不对哦
   ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式 
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //连续转换模式
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-8-28
在线时间
1 小时
发表于 2019-12-18 10:04:55 | 显示全部楼层
的确是ADC频率设置的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 17:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表