OpenEdv-开源电子网

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

定时器中断里的AD转换有问题

[复制链接]

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
发表于 2013-5-14 17:01:23 | 显示全部楼层 |阅读模式

我用的STM32VET6晶振是8M的,我设置的定时器中断的时间是5ms中断一次,也就是5ms转换一次ad,到这一步“while(!(ADC1->SR&1<<1));”就不动了,也就是程序一直执行这一步,不知道为什么?我要是把定时器中断里面ad转换程序隐藏的话,主函数里面的ad转换可以正常。不知道为嘛会这样?

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

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-5-14 18:20:07 | 显示全部楼层
回复【楼主位】47933673:
---------------------------------
发个程序段看下
努力努力
回复 支持 反对

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2013-5-14 21:37:18 | 显示全部楼层
ad转换程序肯定没有问题,是用的原子哥的程序,我就是把ad转换程序放到定时器中断里面就不行了就到“while(!(ADC1->SR&1<<1));”这一步就执行不下去了,不知道为什么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-14 22:47:02 | 显示全部楼层
我怎么一改就出来了,正常的很?

实验17 ADC实验_中断版本.rar

132.12 KB, 下载次数: 1457

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2013-5-15 08:42:48 | 显示全部楼层
那我再试试
回复 支持 反对

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2013-5-15 10:07:02 | 显示全部楼层
我刚才试过了,还是不行呀!我把中断时间延长到50MS中断一次还是不行,下面是程序
         if(!(ADC1->SR&1<<1)){//检测ad是否在忙
T0_AD_yali=Read_ADC1_path(Path_yali);  //Path_yali为0
上面是中断里面的函数
u16 Read_ADC1_path(u8 path)
{
//设置转换序列     
ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=path;        
ADC1->CR2|=1<<22;       //启动规则转换通道 
while(!(ADC1->SR&1<<1));//等待转换结束      
return ADC1->DR; //返回adc值

}
这是ad转换函数

每次运行到ad转换函数的while(!(ADC1->SR&1<<1));//等待转换结束 这一步就不动了,主函数里面可以正常转换,就是中断里面不行

谁来帮帮我呀?我都快疯了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-15 10:18:46 | 显示全部楼层
感情我老被人耍...
你说不行嘛,我测试我的代码,又是运行良好...
我就是把3楼的代码改成了50ms采样一次,4999改为499,然后Get_Adc_Average改为:
u16 Get_Adc_Average(u8 ch,u8 times)
{     
return Get_Adc(ch);

以提高速度。

实际运行良好...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2013-5-15 10:32:08 | 显示全部楼层
原子哥哥不好意思,对不起,自从我买了你的开发板我学习了好多,在论坛上我也学习了好多,我一直在帮你宣传,我会努力的,我可是你的忠实粉丝哦

我把中断程序改为500MS中断一次的话就可以运行了,不知道为什么中断设置5ms不行,设置50ms也不行,是不是我中断里面的程序量太大了?
回复 支持 反对

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2013-5-15 21:31:09 | 显示全部楼层
原子哥  你把中断时间改为5ms中断一次肯定不行  不知道为什么,5ms时间已经是够长了,但是不知道为什么不行
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-16 00:02:58 | 显示全部楼层
你再研究几天吧,我很忙.
下周一之前你还没搞定,我再看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2013-5-16 09:52:31 | 显示全部楼层

我今天弄出来了,我来说说我研究的结果,结果就是,把ad转换放到定时器中断里面的话,如果定时器中断的时间小于10ms就不行,“while(!(ADC1->SR&1<<1));”这一步就执行不下去了。如果要是定时器的时间大于等于10ms的话就可以正常运行,不知道为什么?
我总共用用了5个通道分别是PA0、PA1、PA2、PA3、PA6,中断里面只转换PA0通道

我感觉是不是AD初始化函数有问题呀?我是在原子哥的函数上修改的,下面程序有颜色的就是我修改过的,请大家看看这个初始化函数对不对。谢谢了


/****************************************
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3、6 
******************************************/
void ADC0_12Bit_Init(void)
{
//先初始化IO口
  RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
 GPIOA->CRL&=0XF0FF0000;//PA0 1 2 3 6 anolog输入
 //通道10/11设置   
 RCC->APB2ENR|=1<<9;    //ADC1时钟使能  
 RCC->APB2RSTR|=1<<9;   //ADC1复位
 RCC->APB2RSTR&=~(1<<9);//复位结束    
 RCC->CFGR&=~(3<<14);   //分频因子清零 
 //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
 //否则将导致ADC准确度下降!
 RCC->CFGR|=2<<14;       
 ADC1->CR1&=0XF0FFFF;   //工作模式清零
 ADC1->CR1|=0<<16;      //独立工作模式 
 ADC1->CR1&=~(1<<8);    //非扫描模式
      
 ADC1->CR2&=~(1<<1);    //单次转换模式
 ADC1->CR2&=~(7<<17);   
 ADC1->CR2|=7<<17;    //软件控制转换 
 ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
 ADC1->CR2&=~(1<<11);   //右对齐
 ADC1->CR2|=1<<23;      //使能温度传感器

 ADC1->SQR1&=~(0XF<<20);
 ADC1->SQR1&=0<<20;     //1个转换在规则序列中 也就是只转换规则序列1      
 //设置通道0~3、6的采样时间
 ADC1->SMPR2&=0XFFE3F000;//通道0,1,2,3,6采样时间清空
 ADC1->SMPR2|=7<<18;      //通道6  239.5周期,提高采样时间可以提高精确度  
 ADC1->SMPR2|=7<<9;      //通道3  239.5周期,提高采样时间可以提高精确度 
 ADC1->SMPR2|=7<<6;      //通道2  239.5周期,提高采样时间可以提高精确度 
 ADC1->SMPR2|=7<<3;      //通道1  239.5周期,提高采样时间可以提高精确度 
 ADC1->SMPR2|=7<<0;      //通道0  239.5周期,提高采样时间可以提高精确度
  
 ADC1->SMPR1&=~(7<<18);  //清除通道16原来的设置 
 ADC1->SMPR1|=7<<18;     //通道16  239.5周期,提高采样时间可以提高精确度 

 ADC1->CR2|=1<<0;     //开启AD转换器 
 ADC1->CR2|=1<<3;        //使能复位校准 
 while(ADC1->CR2&1<<3);  //等待校准结束    
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。   
 ADC1->CR2|=1<<2;        //开启AD校准   
 while(ADC1->CR2&1<<2);  //等待校准结束
 //该位由软件设置以开始校准,并在校准结束时由硬件清除

}

回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-13 20:37:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-3-1
在线时间
6 小时
发表于 2013-8-31 22:07:50 | 显示全部楼层
回复【4楼】正点原子:

我怎么一改就出来了,正常的很?

---------------------------------
原子哥,我最近也碰到了这问题:我把Get_Adc(ADC_CH0)放在了定时器中断里面,一旦中断定时时间小于42ms左右时,程序就跑飞了,但是只要屏蔽掉Get_Adc(ADC_CH0),程序又可以运行了。我想问一下这是不是中断溢出引起的啊?求指教。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-31 22:57:36 | 显示全部楼层
回复【13楼】我爱单片机:
---------------------------------
不是中断溢出引起的。
你可以仿真看看,是不是确实死机,还是一直在中断?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-3-1
在线时间
6 小时
发表于 2013-9-8 21:43:24 | 显示全部楼层
回复【14楼】正点原子:

回复【13楼】我爱单片机:
---------------------------------
不是中断溢出引起的。
你可以仿真看看,是不是确实死机,还是一直在中断?

---------------------------------
哈哈,我已经解决了,方法是在mian函数里把adc初始化放在定时器初始化的前面,时间定时1ms也可以了。冒昧问一下原子哥为什么初始化函数的顺序会影响程序呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-8 23:16:12 | 显示全部楼层
回复【15楼】我爱单片机:
---------------------------------
定时器一配置就会进入一次中断的,可能是这个原因。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-7-30
在线时间
22 小时
发表于 2014-12-12 14:09:26 | 显示全部楼层
回复【15楼】我爱单片机:
---------------------------------
啊哈 ,灰常感谢 。我今天刚好碰到这个问题
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-6-3
在线时间
6 小时
发表于 2015-8-8 11:15:24 | 显示全部楼层
回复【15楼】我爱单片机:
---------------------------------谢谢,非常感谢!
开启超人模式!
回复 支持 反对

使用道具 举报

5

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
447
金钱
447
注册时间
2015-12-11
在线时间
143 小时
发表于 2016-7-14 04:28:04 | 显示全部楼层
良心贴啊:'(
调了一天一夜了
回复 支持 反对

使用道具 举报

281

主题

310

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3436
金钱
3436
注册时间
2017-1-13
在线时间
274 小时
发表于 2017-5-4 14:14:52 | 显示全部楼层
确实是,把ADC初始化放在timer初始化前就ok,太感谢了,我也调试半天了,没有看到这个帖子之前,一直不成功。
回复 支持 反对

使用道具 举报

281

主题

310

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3436
金钱
3436
注册时间
2017-1-13
在线时间
274 小时
发表于 2017-5-4 14:29:52 | 显示全部楼层
我爱单片机 发表于 2013-9-8 21:43
回复【14楼】正点原子:

                                                                        回复【13楼】我爱单片机:
---------------------------------
不是中断溢 ...

调试一上午,我正郁闷呢。Timer中采样这么常用的功能,居然不能使用。强,这都能想到,牛!
回复 支持 反对

使用道具 举报

281

主题

310

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3436
金钱
3436
注册时间
2017-1-13
在线时间
274 小时
发表于 2017-5-5 14:08:11 | 显示全部楼层
为什么ad初始化在timer初始化之后就不行呢?今天花点时间查了一下,问题原因是timer初始化后会直接进入timer中断,又ad还没有初始化,所以会一直处于ad采样循环。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-3-29
在线时间
3 小时
发表于 2018-4-7 10:16:09 | 显示全部楼层
我的AD初始化就是在定时器初始化前面的,为什么也不行呢?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-3-29
在线时间
3 小时
发表于 2018-4-7 10:18:08 | 显示全部楼层
这个程序目前是显示PM2.5,温湿度,PM2.5传感器用的是GP2Y1014AU(模拟输出),温湿度用的是DHT11(数字输出),有个问题就是当K=Adc0832();这句放到中断里面,温湿度会变化,但是PM2.5就没有值,不会自己变化,得按一下复位键才显示值,当K=Adc0832();这句放到主函数里面,PM2.5就有值变化,但是温湿度的值没有了,按复位键也没有值。开始我怀疑中断函数影响了液晶屏的时序,但是后面直接给一个K值,PM2.5和温湿度都会变,我就找不到是哪里的问题了。这是我的程序和仿真图,能帮我看看是哪里的问题吗?

压缩文件.rar

75.7 KB, 下载次数: 17

回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-3-29
在线时间
3 小时
发表于 2018-4-7 10:53:41 | 显示全部楼层
我爱单片机 发表于 2013-9-8 21:43
回复【14楼】正点原子:

                                                                        回复【13楼】我爱单片机:
---------------------------------
不是中断溢 ...

为什么我的ad初始化在定时器初始化前面也不行呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 08:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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