打印

ADC启动转换外部事件疑问?

[复制链接]
2822|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whlcsu|  楼主 | 2012-3-12 13:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我的设置如下:
定时器1采用中央对齐模式3;
选择定时器1的CC3事件启动ADC转换。

我的问题是:是在上升匹配和下降匹配都会去启动ADC转换吗?我实测了下,我的代码中每个PWM周期只启动了一次ADC转换。

请香主明示。。。
沙发
香水城| | 2012-3-12 14:02 | 只看该作者
中央对齐模式3是什么模式?

使用特权

评论回复
板凳
香水城| | 2012-3-12 14:12 | 只看该作者
中央对齐模式3是什么模式:
The Output compare interrupt flag of channels configured in output is set when: the counter counts down (Center aligned mode 1, CMS = "01"), the counter counts up (Center aligned mode 2, CMS = "10") the counter counts up and down (Center aligned mode 3, CMS = "11").

如果我没有记错的话,触发ADC的是update event。

STM32_TIM_Center_Aligned_Mode.GIF (34.4 KB )

STM32_TIM_Center_Aligned_Mode.GIF

使用特权

评论回复
地板
whlcsu|  楼主 | 2012-3-12 14:49 | 只看该作者
本帖最后由 whlcsu 于 2012-3-12 14:57 编辑

3# 香水城

香主,我说的中央对齐模式3是指TIM1的PWM计数模式,我的代码如下:
TIM_TIMBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3; //中央对齐模式3,上升匹配和下降匹配均置比较中断标志

香主说触发ADC的是Update Event?

ADC的CR2寄存器中,有这么几位

请香主看看我的理解有没有错误。。。

使用特权

评论回复
5
whlcsu|  楼主 | 2012-3-12 15:34 | 只看该作者
3# 香水城

香主,请审阅一下我楼上的说法吧

使用特权

评论回复
6
香水城| | 2012-3-12 17:54 | 只看该作者
是的,4楼的理解是对的,我的理解有误,不是update event,:L

又想了一下,其实你看到的现象是对的,只不过你想错了。

以一个例子说明,例如你设定的周期是0~100,比较值是30,则:
1)计数器会从0递增计数到100,
2)再从100递减计数到0,
3)循环上述过程。
在步骤1)比较成功一次,在步骤2)又比较成功一次。

每个PWM周期应该是上述步骤1+步骤2,但你把它想象为只有一个步骤了,是不是这样呢?

使用特权

评论回复
7
whlcsu|  楼主 | 2012-3-12 18:16 | 只看该作者
本帖最后由 whlcsu 于 2012-3-12 18:20 编辑

6# 香水城

禀香主,似乎我找到了解释:

一个PWM周期只有一个上升沿,故而每个PWM周期只一次启动ADC。。。

使用特权

评论回复
8
香水城| | 2012-3-12 18:24 | 只看该作者
6# 香水城

禀香主,似乎我找到了解释:
99250
一个PWM周期只有一个上升沿,故而每个PWM周期只一次启动ADC。。。
whlcsu 发表于 2012-3-12 18:16


嗯,首先我们要统一一下概念,你说的“一个PWM周期”是我在6楼描述的一个步骤,还是2个步骤(步骤1+步骤2)?

如果是前者,似乎你的要求已经达到。
如果是后者,则很可能是7楼说的原因。这样的话,简单的做法是:把周期的长度缩短一半,即把频率提高一倍。

使用特权

评论回复
9
whlcsu|  楼主 | 2012-3-12 19:15 | 只看该作者
8# 香水城
一个PWM周期,是香主说的步骤1+步骤2。
另,欲与香主探讨一下STM32的执行速度问题,望香主不厌我烦。
首先上图:

图中红线框起来的部分即为我实际的中断服务程序。由于这个中断服务程序有4个运行轨迹,因此数组中存储的数值如下:
150
158
102
102
...
如此循环

按照这种方法,ISR执行的时间为1/72×158=2.19us!!而且,尚且未考虑中断响应时间和入栈出栈时间呢。

如果真是这样,中断服务程序耗时2.19us相对于我的控制周期8.77us来说,完全不能满足应用要求。

STM32真有这么慢吗?

使用特权

评论回复
10
whlcsu|  楼主 | 2012-3-13 09:52 | 只看该作者
@香主:P
自己顶起,望香主给予支援。。。

使用特权

评论回复
11
jack_shine| | 2012-3-13 09:53 | 只看该作者
whlCSu的程序写的很规范,赞一个:)

使用特权

评论回复
12
lkl10800139| | 2012-3-13 10:25 | 只看该作者
很强,学习啦

使用特权

评论回复
13
whlcsu|  楼主 | 2012-3-13 12:29 | 只看该作者
11# jack_shine

过奖了。。。
只是,到现在还没有解决运行时间的问题,不知香主和各位大侠有何指教啊!

另,坛里有人知道如何联系ST的技术支持吗?

使用特权

评论回复
14
香水城| | 2012-3-13 14:09 | 只看该作者
1)关于运行时间的测量,比较好且比较准确的做法是:找一个不用的I/O口,在要测量部分的开始和结束分别置高和置低这个I/O口,在板上使用示波器测量这个I/O口上的电平,这样可以非常准确地知道要测量程序段的时间。

2)对于9楼的结论,我没有参照,不知道是否准确或错误,但需要指出的是,你的程序这样写法,肯定不是速度最优的。主要问题是在调用ST提供的库函数部分,要知道这些库函数使用C代码写成,先不说里面的代码量有多少,单单函数的调用与返回就会有不少的时间消耗,而且为了通用性和宏观掩盖寄存器的细节,这些库函数的实现都是比较累赘的,因此使用库函数不会得到好的运行速度。
如果想追求运行速度,请抛开库函数,直接操作寄存器实现需要的功能。

使用特权

评论回复
15
whlcsu|  楼主 | 2012-3-13 21:43 | 只看该作者
14# 香水城

1).按照香主的说法1),我亲测了一下,在第一条代码前I/O置'1',最后一条代码处I/O置'0',示波器测量高电平持续时间,得出2.07us。似乎和用定时器方法测得结果“类似”。。。

2).香主所言极是,在追求高的运行速度时,抛开库函数,直接操作对应的寄存器,有很大的改进。

再次谢过香主的尽心尽力!

使用特权

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

本版积分规则

2

主题

59

帖子

0

粉丝