OpenEdv-开源电子网

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

用ADC采样,怎么用TIM定时器来控制每隔一段时间采集一个数据呢?求赐教。

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
发表于 2014-8-18 09:32:47 | 显示全部楼层 |阅读模式
5金钱
买了原子哥的开发板已经一个月勒,目前还是个小白。
发现这个STM32还是蛮难的,各种参数之间的关系搞的晕头转向的。。。
最近在看ADC这个东西,我输入一个电压信号,用ADC也采集到了,采到的值也是对的。
      现在我想要在这基础上增加一个TIM定时功能,每隔一小段时间读一个ADC的值。然后就没有然后了,搞了一天多还没搞定,网上也没查到我想要的,所以特来论坛向大神们请教
   下面这个是TIM3的初始化
    void Timer_Configuration(void)
{       
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;               //2k的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 500-1;                  // 计数到500产生一个更新事件
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);         //允许更新中断
TIM_Cmd(TIM3, ENABLE); //使能TIM3


下面这个是TIM3的中断函数,我就想每隔一段时间读一下ADC的值,不要刷新的太快而已。
void TIM3_IRQHandler(void)
{
u16 ad_value1;    

 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)      //检测是否发生溢出更新事件
{
   ad_value1=ADC_RegularConvertedValueTab;       //我就想在每次中断的时候读一下ADC的值,这里是不是不对啊。。。
   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);           //清除中断标志位
}

下面是之前的main函数,我仿真的时候能看到ADCzhi在一直变化。
u16 ADCzhi;
while (1)
{
       ADCzhi=ADC_RegularConvertedValueTab;        //ADC_RegularConvertedValueTab表示ADC的值
}
ADC的那一段函数就不贴上来了,感觉那个好像没什么问题。
大神们给我指点一下吧。。。不胜感激啊


最佳答案

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

你可以用定时器做个节拍,然后在主函数里面每个节拍到了,扫描一次,扫描次数你自己定。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 09:32:48 | 显示全部楼层
你可以用定时器做个节拍,然后在主函数里面每个节拍到了,扫描一次,扫描次数你自己定。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 09:44:34 | 显示全部楼层


另外还有个小问题,我仿真的时候main.c里面的变量能在WATCH窗口里面看到变化,可是stm32f10x_it.c里面的变量怎么就显示灰色的啊。。。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 10:09:56 | 显示全部楼层
if(catchTemperatureParameter(ADC_CH0,&getADC,21,9,20))比如这个,这里每5个MS扫描一次,21代表扫描21次,9代表头尾各丢掉9次,中间3次取平均值,20代表20*5MS后开始新一轮ADC,getADC用于保存最终结果,函数返回1表示ADC完成。这样,就算ADC用查询方式,也不用任何delay了。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:09:59 | 显示全部楼层
回复【3楼】TinyBoy:
---------------------------------
话说你说的节拍我不知道怎么弄呢。。。
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-18 10:10:25 | 显示全部楼层
ADC是一个动作,需要触发启动的。
[ad_value]的作用域是哪种?
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:10:28 | 显示全部楼层
回复【5楼】fxltsbl007:
---------------------------------
好的,我来看看先
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 10:12:10 | 显示全部楼层
你用定时器就做一件事情,5ms中断给节拍标志置1就行了,在主函数里面扫描,这样,中断函数里面代码就尽量少。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:12:19 | 显示全部楼层
回复【6楼】styleno1:
---------------------------我就在stm32f10x_it.c的开头定义的,应该就在这里面起作用吧
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:17:36 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
回复【8楼】TinyBoy:
---------------------------------
我再来看看吧。这个看教程把意思大概看懂了点,但是具体用代码怎么来实现不知道怎么整啊。。。太坑了,哈哈。谢谢大神指教啊。我能不能把中断函数直接放到main.c里面去啊
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 10:23:09 | 显示全部楼层
可以啊,但是STM32定时器比较多,把和定时器有关的代码放到同一个文件,也是不错的安排,你把中断函数放到main.c里面去,文件多了,感觉有点乱。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:23:28 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
大神,你三楼的函数是怎么来的,我再网上好像查不到的节奏啊。你自己定义的?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 10:25:56 | 显示全部楼层
回复【12楼】fxltsbl007:
---------------------------------
 这个当然是我自己写的嘛,至于节拍,你随便定义个位变量使用就行了嘛。
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-18 10:31:41 | 显示全部楼层
还有啊,中断里面作为标志或类似寄存器的变量要用“vu”类型,不让编译器优化。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:33:38 | 显示全部楼层
回复【14楼】STM32VBT6:
---------------------------------
额。好吧。这个我还不知道呢。谢谢了啊。我来查查看。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 10:34:32 | 显示全部楼层
回复【14楼】STM32VBT6:
---------------------------------
随便了,你能弄出来就OK了,你用其他类型也可以啊,只要能达到效果就行了。
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-18 10:42:36 | 显示全部楼层
回复【16楼】TinyBoy:
---------------------------------
实验中,不用vu好像也能得到相同的结果,但打开STM32的固件库,它所有的寄存器都是用vu定义的,保留的才用u,这肯定有它的道理的。
以前查过Volatile变量类型的使用方法,讲解的比较深入,你们可以参考看看。
我觉得严谨点还是比较好,在工程中要是因为这个的使用不当而出问题,恐怕死都找不出来原因。毕竟常规c语言里面很少用到这个类型。
特别是在中断中设一个作为标志的全局变量供主函数查询,它是不断变化的,最好用vu。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:47:09 | 显示全部楼层
回复【17楼】STM32VBT6:
---------------------------------
恩,我注意下,这里好多大神啊。我要向你们学习,早日掌握这玩意。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 10:50:13 | 显示全部楼层
回复【17楼】STM32VBT6:
---------------------------------
以后工作要弄这个。才学了一个月,完全是一头雾水啊。上学的时候C语言,单片机也都学的不好。。。。哎。慢慢努力吧。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 10:53:16 | 显示全部楼层
回复【18楼】fxltsbl007:
---------------------------------
 Volatile修饰的变量表明这个变量的值可能会不随人的意志随时改变,一般用于修饰寄存器变量,至于其他变量,也可以,我比较少用,当然,一些怪异的问题,可以往这方面找,学习了。
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-18 10:56:17 | 显示全部楼层
再告诉你一个秘密,定时器启动后会立即进入更新中断(如果打开的话),如果你预期是先定时一段时间再采集的话,可能就多了一次启动时的。
这个对你的实验倒是没什么影响,可是中断要是作为计数的话,就要出大问题了,会多记一次!
建议你将:
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);         //允许更新中断
TIM_Cmd(TIM3, ENABLE); //使能TIM3
改为:
1.启动定时器;
2.清除更新中断标志;
3. 使能更新中断。
这样就确定了初始状态,结果可控了。
不信你做个实验测试一下。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 11:00:50 | 显示全部楼层
回复【21楼】STM32VBT6:
---------------------------------
额,这样的啊。我再网上看资料,有的里面加了清除更新的代码,有的没有加,也不太明白在软件里面具体是怎么执行的,就没有加。谢谢了啊。

主要是通用定时器的教程里面好像也没这句代码,哈哈。我现在还是以模仿别人写的代码为主。现在知道这句话的意思勒。

话说不知道再过两个月能不能入门,,,每天老板问我学到什么地步了,都压力好大啊。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 11:03:57 | 显示全部楼层
回复【21楼】STM32VBT6:
---------------------------------
TIM_ClearFlag(TIM3, UPdate);
你说的清除中断标志是不是就是这句啊
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2014-6-27
在线时间
1007 小时
发表于 2014-8-18 11:05:41 | 显示全部楼层
回复【22楼】fxltsbl007:
---------------------------------
 没事了,你慢慢调,用示波器看节拍对不对,对了,说明代码是对的,不对再改,反正你可以设置几百MS采样ADC一次,启动进入一次中断也无妨。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 11:07:18 | 显示全部楼层
回复【24楼】TinyBoy:
---------------------------------
en ,谢谢了啊
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-18 11:07:55 | 显示全部楼层
回复【22楼】fxltsbl007:
---------------------------------
原子哥的代码也有不完善的地方。这是其中之一。
我觉得做实验先看下原理,理解了之后再自己思考看能写出自己的代码么,再对照例程看看自己的不足之处在哪,例程里面有什么值得学习借鉴的地方。
哪些地方你做的比例程还要好。这样能学到的更多,理解得更深。不过这要以花更多的时间作为代价。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 11:17:22 | 显示全部楼层
回复【21楼】STM32VBT6:
---------------------------------
TIM_Cmd(TIM3, ENABLE); //使能TIM3 
TIM_ClearFlag(TIM3, UPdate)
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);         //允许更新中断 

大哥,按照20楼的1、2、3顺序,是不是这样的代码啊。可是我看别人代码都是把
TIM_Cmd(TIM3, ENABLE); //使能TIM3 
这句放在最后的呀。第一行和第三行能换下位置不
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-18 11:23:50 | 显示全部楼层
回复【27楼】fxltsbl007:
---------------------------------
使能后就立即产生中断,你要是最后打开定时器,就又中断了。前面的清零白清了。
是否对,你做个测试就知道了,实验最可靠也最深刻。
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-7-20
在线时间
3 小时
 楼主| 发表于 2014-8-18 11:35:59 | 显示全部楼层
回复【28楼】STM32VBT6:
---------------------------------
恩,。好的。
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2014-8-20 08:40:52 | 显示全部楼层
不能直接用定时器产生一个出发信号吗?
回复

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2014-8-19
在线时间
13 小时
发表于 2014-8-20 11:07:20 | 显示全部楼层
应什么触发的ADC?
希望与更多的电子爱好者交朋友
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-7-3
在线时间
0 小时
发表于 2015-7-7 11:08:56 | 显示全部楼层
楼主,每隔一段时间采样的问题解决了吗?我也想问问?留下联系方式吧,谢谢了。。。。我的企鹅1780732880
回复

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
发表于 2015-10-22 11:44:47 | 显示全部楼层
我遇到了两个定时器同时打开中断,发现只有一个定时器能进入中断,这不知道什么原因了
回复

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-2-26 14:23:58 | 显示全部楼层
creating 发表于 2015-10-22 11:44
我遇到了两个定时器同时打开中断,发现只有一个定时器能进入中断,这不知道什么原因了

是不是因为中断优先级的原因啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-9-22 16:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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