OpenEdv-开源电子网

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

ADC什么时候开始工作?cmd还是SoftwareStart?

[复制链接]

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-20 10:04:40 | 显示全部楼层 |阅读模式
5金钱

懂的大侠帮忙解答下:
执行完第一步代码后,ADC开始工作没?处于什么状态了?
1.
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));

2.
ADC_SoftwareStartConvCmd(ADC1,ENABLE);


想实现:
初始化完后,可能几个小时都不使用ADC。
一旦硬件点击了启动,才开始ADC转换。
在初始化里,写到哪一步?应用从哪句开始好?
驱动和应用在哪一步分开?

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

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:09:30 | 显示全部楼层
你可以使用手动启动,想ADC了就启动。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:10:38 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
怎么启动?cmd写到应用里还是初始化?

其实我用的定时器启动。我想的是第一步放到初始化里

如果此时ADC不工作的话最好,然后,我想启动了
我就 TIM_Cmd(TIM3, ENABLE);  
想停了就 TIM_Cmd(TIM3, DISABLE);  

想是这么想,不知道具体是怎样执行的,还有dma也加了。
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:16:17 | 显示全部楼层
回复【3楼】jiutianshenjian:
---------------------------------

当然是写到应用里了,初始化你可以初始化其他的,不启动,你需要了再启动,这难道不是你想要的么。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:18:35 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
ADC_Cmd(ADC1, ENABLE);开了就启动了?
还是软件或定时器触发才启动?
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:21:16 | 显示全部楼层
回复【3楼】jiutianshenjian:
---------------------------------

你可以使用定时器让它周期性的启动ADC,转换结果保存,当然,转换结果滤波什么的你灵活处理,之后的事情你就不用管了,什么时候想用到ADC的结果,就去拿结果就行了,结果一定是最近转换处理出来的结果。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:25:10 | 显示全部楼层
回复【5楼】jiutianshenjian:
---------------------------------

如果每次ADC都要调用这个函数,就是软启动了,定时器触发只是你辅助的一种机制而已。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:26:01 | 显示全部楼层
回复【6楼】TinyBoy:
---------------------------------
后面的都做了,你没明白我的问题

分离驱动和应用。系统启动时需要初始化adc。不知道初始化到哪一步。把后面的代码准备放到应用里面

就是想不使用的时候,让他不要占用cpu,用到的时候能灵活启动和停止。
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:29:59 | 显示全部楼层
回复【8楼】jiutianshenjian:
---------------------------------
你用函数版的,我没用过,看代码,第一行函数应该在初始化使用,最后一行函数在应用需要的时候用。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:31:29 | 显示全部楼层
之前我都放在应用里的,现在按要求所有初始化的东西都放到BSP_init();里面。然后应用里面能随意控制。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:32:51 | 显示全部楼层
回复【9楼】TinyBoy:
---------------------------------
噢,我也是这么想的。只不过因为写了ADC_Cmd(ADC1, ENABLE);
不知道adc不触发的时候是不是不工作。了解不够。
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:34:46 | 显示全部楼层
回复【11楼】jiutianshenjian:
---------------------------------
只要你初始化好了,设置的是手动触发ADC,只要它有这个功能,就一定可以用,我都是用这种方式的,没问题。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:42:52 | 显示全部楼层
参考手册里面:
通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断
电状态下唤醒。 
ADC上电延迟一段时间后(t STAB ),再次设置ADON位时开始进行转换。 
通过清除ADON位可以停止转换,并将ADC置于断电模式。在这个模式中,ADC几乎不耗电(仅
几个μA)。 

按照这个说法,应该是只要   ADC_Cmd(ADC1, ENABLE);了,adc就开始工作转换了。那放初始化里,他自己就先开始占cpu了。
顺便提一句,对于再次设置那个没懂,貌似库函数都只一次   ADC_Cmd(ADC1, ENABLE);
没看到在哪里写两次的。如果安手册里所说,第二次又该写在哪里呢?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:44:19 | 显示全部楼层
回复【12楼】TinyBoy:
---------------------------------
是的,实现功能。目前是没问题的。
因为在μcosii里面,按领导要求没事不能占着茅坑不拉屎。。。
所以。。。
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:48:41 | 显示全部楼层
回复【13楼】jiutianshenjian:
---------------------------------

他自己就先开始占cpu了?首先,你开启了ADC,它是硬件ADC,不占用CPU的时间,其次,我认为它只是设置了使用了ADC,什么时候使用ADC进行转换,ADC_SoftwareStartConvCmd(ADC1,ENABLE);这个函数才是启动转换,这里占不占用CPU,怎样占用,看你程序的算法了。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 10:53:30 | 显示全部楼层
回复【7楼】TinyBoy:
---------------------------------
总结你的意思就是,第一步放到初始化里,不会产生额外的开销。
开启第二步时,adc才占用系统资源。

会不会是第二步,隐含地执行了再次设置ADON位这个操作呢?
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 10:57:12 | 显示全部楼层
回复【14楼】jiutianshenjian:
---------------------------------
你没有必要太纠结这个占用问题,用UCOS,所有任务是有调度的,你更没必要纠结这个问题了.
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 11:01:30 | 显示全部楼层
我就是怕使能ADON位后,ADC哗哗哗就跑起来了
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 11:05:33 | 显示全部楼层
回复【18楼】jiutianshenjian:
---------------------------------
你开启ADC之后,就跑了是吧,不要死等,ADC硬件开始转换了,只有你跑这些代码的开销,下一次调度进来(最好一个节拍调度),看标志转换完了没了,完了处理结果,没有,再调度,你的开销就是跑这些代码的开销。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 11:10:20 | 显示全部楼层
回复【19楼】TinyBoy:
---------------------------------
初始化之后,进入待机界面。用户不一定什么时候想使用adc。说不定有的用户一两年都不用。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 11:12:03 | 显示全部楼层
兄弟,跟我讲了这么久。来喝点咖啡
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 11:15:19 | 显示全部楼层
回复【20楼】jiutianshenjian:
---------------------------------

你用的是UCOS,ADC是有个任务吧,你可以这样,不用了就把这个任务挂起来,要用了,开启任务,启动转换,无论怎样,启动转换前都要设置好ADC,你在初始化里面设置也好,在开启ADC任务前设置也好。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 11:33:10 | 显示全部楼层
回复【22楼】TinyBoy:
---------------------------------
现在开机就是挂起的,挂起后才是adc和dma初始化。按要求硬件初始化都要在开机bsp初始化中完成。
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 11:36:03 | 显示全部楼层
回复【23楼】jiutianshenjian:
---------------------------------

这样很好啊,开始任务之后,里面怎么转换,看你程序算法了。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 11:38:19 | 显示全部楼层
回复【24楼】TinyBoy:
---------------------------------
你是指我现在这样很好,还是要求那样很好呢?感觉那样初始化比较正规。
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 11:43:54 | 显示全部楼层
回复【25楼】jiutianshenjian:
---------------------------------
你的要求是放在初始化,就放在初始化吧,开始任务后,你说的CPU开销就在这里了,初始化的CPU开销没必要在意,没必要抢着先初始化那个模块。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-20 14:53:43 | 显示全部楼层
回复【26楼】TinyBoy:
---------------------------------
还是有问题:
tim3定时触发adc,dma转移数据。
现在要停止adc采集,是要怎么做?TIM_Cmd(TIM3, DISABLE);行不行?要不要adc和dma的cmd都DISABLE呢?
对应的启动adc采集时,是不是要在初始化里去掉adc,dma,tim的如TIM_Cmd(TIM3, ENABLE);单独放到应用里给每个Cmd都ENABLE?
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 17:16:37 | 显示全部楼层
回复【27楼】jiutianshenjian:
---------------------------------
dam我没用过,你ADC什么时候启动转换的?转换完你不回到这个地方不就是停止了嘛,因为你是手动转换的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 03:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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