打印
[STM32F1]

求助ADC问题

[复制链接]
1066|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
azhangxingweia|  楼主 | 2017-9-20 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
为什么程序死在这
沙发
feelhyq| | 2017-9-20 14:17 | 只看该作者
是第一次就死在这里了还是之前可以跳过去?

如果是第一次的话,估计ADC没有配置对,建议检查下配置
如果不是第一次(之前能够采样到AD正确的数据),可能是ADC转换后没有及时读取或者ADC停止了工作

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
azhangxingweia + 1 赞一个!
板凳
azhangxingweia|  楼主 | 2017-9-20 14:21 | 只看该作者
feelhyq 发表于 2017-9-20 14:17
是第一次就死在这里了还是之前可以跳过去?

如果是第一次的话,估计ADC没有配置对,建议检查下配置

void Lsens_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTF时钟       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PF8 anolog输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
}
void T_Adc_Init(void)  //ADC通道初始化
{
        ADC_InitTypeDef ADC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能GPIOA,ADC1通道时钟
  
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //分频因子6时钟为72M/6=12MHz

        ADC_DeInit(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);        //重置指定的ADC1的复位寄存器

    while(ADC_GetResetCalibrationStatus(ADC1));        //获取ADC1重置校准寄存器的状态,设置状态则等待

        ADC_StartCalibration(ADC1);         //开启AD校准

        while(ADC_GetCalibrationStatus(ADC1));                //获取指定ADC1的校准程序,设置状态则等待
}
u16 T_Get_Adc(u8 ch)   
        {

        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道3,第一个转换,采样时间为239.5周期                                      

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
        }
//读取Light Sens的值
//0~100:0,最暗;100,最亮
u8 Lsens_Get_Val(void)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<LSENS_READ_TIMES;t++)
        {
                temp_val+=T_Get_Adc(0);                   //读取ADC值
                delay_ms(5);
        }
        temp_val/=LSENS_READ_TIMES;//得到平均值
        if(temp_val>4000)temp_val=4000;
        return (u8)(100-(temp_val/40));
}
第一次就死在这了

使用特权

评论回复
地板
feelhyq| | 2017-9-20 14:46 | 只看该作者
检查下外围电路

使用特权

评论回复
5
feelhyq| | 2017-9-20 15:05 | 只看该作者
azhangxingweia 发表于 2017-9-20 14:21
void Lsens_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

从配置上没看出什么问题

使用特权

评论回复
6
gujiamao12345| | 2017-9-20 15:58 | 只看该作者
ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
//while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
改成延时呢
return ADC_GetConversionValue(ADC1);   

使用特权

评论回复
7
mmuuss586| | 2017-9-20 20:56 | 只看该作者
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道3,第一个转换,采样时间为239.5周期

这句放在初始化那边看看   

使用特权

评论回复
8
azhangxingweia|  楼主 | 2017-9-21 13:02 | 只看该作者
feelhyq 发表于 2017-9-20 14:46
检查下外围电路

问题解决了把delay_ms(5);屏蔽了就好使了,

使用特权

评论回复
9
feelhyq| | 2017-9-21 13:13 | 只看该作者
azhangxingweia 发表于 2017-9-21 13:02
问题解决了把delay_ms(5);屏蔽了就好使了,

嗯,应该是转换完后你没有及时去读取的原因

使用特权

评论回复
10
kingkits| | 2017-9-21 15:28 | 只看该作者
通常不建议这样使用adc

使用特权

评论回复
11
kingkits| | 2017-9-21 15:30 | 只看该作者
如果你一定要这样做,有一个比较安全的办法就是,在长时间无法读到需要的信号时自己主动从循环里退出来,返回一个可以接受的数值

使用特权

评论回复
12
feelhyq| | 2017-9-22 14:16 | 只看该作者
结帖光荣

使用特权

评论回复
13
azhangxingweia|  楼主 | 2017-9-22 14:19 | 只看该作者

怎么结贴啊

使用特权

评论回复
14
feelhyq| | 2017-9-22 14:21 | 只看该作者

伙计,你要经常逛逛论坛,学学在论坛贴吧泡泡才能学到更多的东西, 比如说 结帖你要学会,你自己慢慢摸索

使用特权

评论回复
15
azhangxingweia|  楼主 | 2017-9-22 14:22 | 只看该作者
feelhyq 发表于 2017-9-22 14:21
伙计,你要经常逛逛论坛,学学在论坛贴吧泡泡才能学到更多的东西, 比如说 结帖你要学会,你自己慢慢摸索 ...

兄弟你会ucos吗

使用特权

评论回复
16
feelhyq| | 2017-9-22 14:26 | 只看该作者

略懂,我们自己做芯片,自己写类似于UCOS一样的实时操作系统。

使用特权

评论回复
17
azhangxingweia|  楼主 | 2017-9-22 14:27 | 只看该作者
feelhyq 发表于 2017-9-22 14:26
略懂,我们自己做芯片,自己写类似于UCOS一样的实时操作系统。

能麻烦你帮我看一下我的程序么,进不到下一个任务

使用特权

评论回复
18
houjiakai| | 2017-9-22 16:46 | 只看该作者
是不是ADC配置有问题?

使用特权

评论回复
19
houjiakai| | 2017-9-22 16:50 | 只看该作者
你的IO复用功能设置正确了吗?

使用特权

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

本版积分规则

23

主题

110

帖子

1

粉丝