OpenEdv-开源电子网

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

STM32 ACD采集问题

[复制链接]

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-7-9
在线时间
0 小时
发表于 2013-10-20 14:22:00 | 显示全部楼层 |阅读模式

采集到的数据一直是 4095   不知道哪里出问题了 找了一天没找出来  来此求助   希望大虾们提点提点!!!
附上代码:
#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "PIN9.h"
#include "adc.h"

u8 ADC_Value[5] = {0};
u8 ah,al,comm = 0;
u16 ad;
u32 tempu32 = 0;

u8 gototime = 0;

void ADC_GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 ADC_InitTypeDef ADC_InitStructure;

    /* 使能 ADC1 and GPIOC clock */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);              //72M/6=12,ADC最大时间不能超过14M

 /* 配置Pc0 pc1 pc2为模拟输入 */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOC, &GPIO_InitStructure);

 /* 配置ADC1, 不用DMA, 用软件自己触发 */
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //ADC1工作模式:独立模式
 ADC_InitStructure.ADC_ScanConvMode = DISABLE;    //单通道模式
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   //单次转换
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   //转换由软件触发启动
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //ADC1数据右对齐
 ADC_InitStructure.ADC_NbrOfChannel = 1;    //顺序进行规则转换的ADC通道的数目
 ADC_Init(ADC1, &ADC_InitStructure);     //根据ADC_InitStruct中指定的参数,初始化外设ADC1的寄存器


// ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道1,规则采样顺序值为1,采样时间为239.5周期
// ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道1,规则采样顺序值为1,采样时间为239.5周期
 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道1,规则采样顺序值为1,采样时间为239.5周期

 /* Enable ADC1 */
 ADC_Cmd(ADC1, ENABLE);    //使能ADC1

 /* Enable ADC1 reset calibaration register */
 ADC_ResetCalibration(ADC1);      //重置ADC1的校准寄存器
 /* Check the end of ADC1 reset calibration register */
 while(ADC_GetResetCalibrationStatus(ADC1));  //获取ADC1重置校准寄存器的状态,设置状态则等待

 /* Start ADC1 calibaration */
 ADC_StartCalibration(ADC1);     //开始ADC1的校准状态
 /* Check the end of ADC1 calibration */
 while(ADC_GetCalibrationStatus(ADC1));  //等待校准完成

 /* Start ADC1 Software Conversion */
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //使能ADC1的软件转换启动功能
}


//数组清零
void ADC_Value_Clear(void)
{
 u8 i;
 for(i=0;i<5;i++)
 {
  ADC_Value=0x20;  //空格键  
 }
}
//检测ADC
void ADC_Detection(void)
{
     while(Status==SET)Status=ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC);
    AD_num=ADC_GetConversionValue(ADC1);

     ADC_SoftwareStartConvCmd(ADC1, ENABLE);         //软件启动ADC转换
     while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束
     ad = 0;
  ad = ADC_GetConversionValue(ADC1);          //读取ADC值                    
        delay_ms(1);
        
   //   ad &= 0x0fff ;                       
    //  return ad
                                             
}
void Disp_DWQ(u8 x , u8 y )
{
 u16 temp;
 u8 temp0,temp1,temp2,temp3,temp4;
 // 1K-10K电阻
 u8 i;
 ADC_Value_Clear();    //清空数据
 ADC_Detection();    //检测AD值
 temp=ad;       //备份
 temp0=temp/10000;
 temp1=temp%10000/1000;
 temp2=temp%1000/100;
 temp3=temp%100/10;
 temp4=temp%10;
 ADC_Value[0]=temp0+48;
 ADC_Value[1]=temp1+48;
 ADC_Value[2]=temp2+48;
 ADC_Value[3]=temp3+48;
 ADC_Value[4]=temp4+48;

 if(x==1) x=2;
  else if(x==2)x=1;
// ERR=PIN9_Detection_D(); //检测单头9芯
 Write12864(0x80+8*x+y,0); //合并生成坐标地址写入LCD12864
 for(i=0;i<5;i++)
 {
 // if(Pin_Num!=0x20)
  Write12864(ADC_Value,1);
 // delay_ms(1);  
 }
// Write12864(0x80+8*(x+2)+y,0); //合并生成坐标地址写入LCD12864
// Write12864(ERR+48,1); //下两行显示错误号
 
}
 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-20 17:09:03 | 显示全部楼层
直接用给我们的例程试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-7-9
在线时间
0 小时
 楼主| 发表于 2013-10-20 18:53:19 | 显示全部楼层
这个发错了  看下面那个
用这个代码也不行呢...显示4095  换了3个通道 C0 C1 C2 分别是通道10 11 12 结果都是一样 ...>
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-7-9
在线时间
0 小时
 楼主| 发表于 2013-10-20 18:54:32 | 显示全部楼层
发错啦 发错啦 发错啦 
我改完后的
#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "PIN9.h"
#include "adc.h"

u8 ADC_Value[5] = {0};
u8 ah,al,comm = 0;
u16 ad;
u32 tempu32 = 0;

u8 gototime = 0;
void  ADC_GPIO_Configuration(void)

ADC_InitTypeDef ADC_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟
 

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

//PC2 作为模拟通道输入引脚                         
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 |  GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);

ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC_ResetCalibration(ADC1); //使能复位校准  
 
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束

ADC_StartCalibration(ADC1);  //开启AD校准
 
while(ADC_GetCalibrationStatus(ADC1));  //等待校准结束
 
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能

}   
//获得ADC值
//ch:通道值 0~3
u16 ADC_Detection(u8 ch)   
{
   //设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期        
  
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 ADC_Detection_AVG(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=ADC_Detection(ch);
delay_ms(5);
}
return temp_val/times;

//数组清零
void ADC_Value_Clear(void)
{
u8 i;
for(i=0;i<5;i++)
{
ADC_Value=0x20; //空格键
}
}

void Disp_DWQ(u8 x , u8 y )
{
u16 temp;
u8 temp0,temp1,temp2,temp3,temp4;
// 1K-10K电阻
u8 i;
ADC_Value_Clear();   //清空数据
temp=ADC_Detection_AVG(11,10); // 12通道,采集10次求平均值
temp0=temp/10000;
temp1=temp%10000/1000;
temp2=temp%1000/100;
temp3=temp%100/10;
temp4=temp%10;
ADC_Value[0]=temp0+48;
ADC_Value[1]=temp1+48;
ADC_Value[2]=temp2+48;
ADC_Value[3]=temp3+48;
ADC_Value[4]=temp4+48;

if(x==1) x=2;
else if(x==2)x=1;
// ERR=PIN9_Detection_D(); //检测单头9芯
Write12864(0x80+8*x+y,0); //合并生成坐标地址写入LCD12864
for(i=0;i<5;i++)
{
// if(Pin_Num!=0x20)
Write12864(ADC_Value,1);
// delay_ms(1);
}
// Write12864(0x80+8*(x+2)+y,0); //合并生成坐标地址写入LCD12864
// Write12864(ERR+48,1); //下两行显示错误号

}

应该是这个 ...............................>
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-7-9
在线时间
0 小时
 楼主| 发表于 2013-10-20 18:55:29 | 显示全部楼层
只有显示部分和 通道改了 其他没改 也不行呢 ..... 一直都是4095
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-7-9
在线时间
0 小时
 楼主| 发表于 2013-10-20 20:21:21 | 显示全部楼层
问题解决了  板子上的VREF+没接电源 不是软件问题  谢谢原子哥
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-10 20:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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