你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F334的ADC使用问题

[复制链接]
budaoweng 提问时间:2018-4-18 09:20 /
本帖最后由 budaoweng 于 2018-4-18 09:22 编辑

如图,这是最近做的全桥移相的一个实验板,只包含了控制和驱动还有功率管,主控是F334。比较业余板子做的不怎么样,勿喷。
前段时间开始写程序,先是遇到HRTIM的问题,后来摸索10来天,问题基本搞定,已经上电试过,没发现问题。现在开始写PID算法,算法写出个框架了,可是在写ADC采样程序的时候遇到了出乎意料的问题。
问题是这样的,
1、我想在每个周期的上升沿进行电流采样,每个周期的下降沿停止采样,来计算每个周期的有功功率和一些其它参数。由tim3更新事件来触发ADC转换,然后用中断(中断可以是来自HRTIM或者外部PWM的周期上下沿中断)来开启和关断TIM3。ADC的数值由ADC的中断读入到数组。由于在实际应用中频率是变化的,所以没办法使用DMA来确定每个周期需要采集的点数。其实用不用DMA都无所谓,主要是遇到一下问题。
TIM3的时钟是72M,周期为72,由它来驱动ADC,采样率应该是1M,当对40KHZ进行采样的时候,周期25us,所以对应的AD采样点也应是25个点才对,但是我的数组出来的个数是乱七八糟的,有时候多有时候少,更改TIM3的周期寄存器,也就是更改触发的速度,数组里的采样点的数量变化的也不对,反正就是对不上。
2、后来干脆去掉TIM3触发,由PWM上下沿中断直接软件启动和关闭ADC,同时在ADC的中断读取数值,奇怪的是,40K的PWM,总采样时间25us,但是得到的点数才10多个,难道ADC转换速度这么慢?不是能到到5M以上吗?还有就是我把PWM频率提升到65k,心想采样点数肯定变得更少,谁知道采样点数竟然变成24个,崩溃中呀,说白了,这个ADC采样点数和由TIM3触发时差不多,采样速度不受控制,有多有少。

以上就是大概遇到问题,之前用F103的时候就这么干过,就是采样频率没有这么高而已,本以为这次没问题的地方出来这么大问题希望各位同仁帮帮忙

做的全桥实验板,控制和驱动

做的全桥实验板,控制和驱动
收藏 评论13 发布时间:2018-4-18 09:20

举报

13个回答
wenyangzeng 回答时间:2018-4-18 09:58:37
ADC采样速率主要看ADC初始化时的配置,没有在帖子里看到相关配置。也就是说如果ADC配置速率不都快,你如何提高TIMx、PWM触发ADC的速度都无用的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

budaoweng 回答时间:2018-4-18 11:27:50
wenyangzeng 发表于 2018-4-18 09:58
ADC采样速率主要看ADC初始化时的配置,没有在帖子里看到相关配置。也就是说如果ADC配置速率不都快,你如何 ...

时钟是没问题的,因为我用的CUBEMX进行初始化的。再者,就算是速度不够,也不至于说时快时慢呀
hadc2.Instance = ADC2;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc2.Init.Resolution = ADC_RESOLUTION_8B;
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc2.Init.ContinuousConvMode = DISABLE;
  hadc2.Init.DiscontinuousConvMode = DISABLE;
  hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONVHRTIM_TRG1;
  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc2.Init.NbrOfConversion = 1;
  hadc2.Init.DMAContinuousRequests = ENABLE;
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Regular Channel
    */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
wenyangzeng 回答时间:2018-4-18 13:02:38
budaoweng 发表于 2018-4-18 11:27
时钟是没问题的,因为我用的CUBEMX进行初始化的。再者,就算是速度不够,也不至于说时快时慢呀
hadc2.In ...

楼主使能了DMA,
hadc2.Init.DMAContinuousRequests = ENABLE;
但好像没有DMA处理函数。

还有,这个 sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
好像太短了,ADC采样电路充电时间太短了。
budaoweng 回答时间:2018-4-18 13:14:21
wenyangzeng 发表于 2018-4-18 13:02
楼主使能了DMA,
hadc2.Init.DMAContinuousRequests = ENABLE;
但好像没有DMA处理函数。

我虽然使能DMA但没有用到,这个地方倒是无所谓。你说的充电时间短了?难道配置成最短时间也会导致ADC速度变慢???
wenyangzeng 回答时间:2018-4-18 13:19:44
budaoweng 发表于 2018-4-18 13:14
我虽然使能DMA但没有用到,这个地方倒是无所谓。你说的充电时间短了?难道配置成最短时间也会导致ADC速度 ...

1、没有用DMA就应该关闭.否则DMA读走了ADC数据,你再去读ADC不知道是否读到应该读的数据否?
2、感觉1CYCLE_5实在太短了。
budaoweng 回答时间:2018-4-18 14:08:46
wenyangzeng 发表于 2018-4-18 13:19
1、没有用DMA就应该关闭.否则DMA读走了ADC数据,你再去读ADC不知道是否读到应该读的数据否?
2、感觉1CYC ...

是应该关闭。因为我已经反复试过多次各种配置都是一个结果,所以也懒得去改了。我的问题不在于精度问题,而是速度问题,所以采样时间长短好像关系不大。
还有个问题请教一下,就是像我这种用PWM开启和关断TIM,然后通过TIM触发ADC开启和关断,所以采样点数是不固定的,这种情况下就没办法配置DMA传输数据的个数了。真是头疼呀
wenyangzeng 回答时间:2018-4-18 16:00:35
budaoweng 发表于 2018-4-18 14:08
是应该关闭。因为我已经反复试过多次各种配置都是一个结果,所以也懒得去改了。我的问题不在于精度问题, ...

其实你可以设置连续转换模式,无需PWM或TIM触发、DMA传送数据,DMA数据满进入中断。
budaoweng 回答时间:2018-4-18 16:55:43
wenyangzeng 发表于 2018-4-18 16:00
其实你可以设置连续转换模式,无需PWM或TIM触发、DMA传送数据,DMA数据满进入中断。 ...

不能这么着呀,我这个必须是这么触发。如果连续采样的话,要如何知道每一个周期内的电压变化情况呢?
budaoweng 回答时间:2018-4-21 21:42:56
昨天把问题解决了,主要是大意了。刚开始我只是想在ADC的中断里看每一次的采样数据,但是ADC的速度提高到1M的时候,每个PWM周期20us,采样的点数远远小于20点,百思不得其解,一直认为是触发的TIM有问题或者是ADC本身有问题。后来就在那么一刹那,单片机进入中断也是有频率限制的,F334的主频是72M,也就是理论进入中断的频率最快不到72M,只要中断里有程序需要执行,那么中断的响应速度就会下降。随后我就测试了一下中断程序的执行时间,发现在5us左右,这也就是为什么ADC在1M以内的时候读取点数正常的原因了。一旦速度达到1M以上的时候,就不能及时进入中断了。解决办法就是,不去看每个点的数值了。直接DMA。而且我这个电源是变频的,所以要保证DMA的点数一致,就必须实时根据PWM的频率更新ADC的采样频率。有想进一步了解的可以随时交流,这段时间做这个项目,所以会随时关注论坛

评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5 结帖奖励,很详细,榜样!

查看全部评分

budaoweng 回答时间:2018-5-3 10:57:31
首次上交流220V测试。运行正常,实时根据输出相位来调节频率。核心程序写的差不多了,还得优化一下。剩下个功率PID,然后就是各种保护模块,人机交互现在只是简单一个频率和功率显示,还有一堆参数输入,串口通信。第一次做这样的项目,进度实在缓慢。
这次的优势在于用一个单片机代替了之前的各种比较器运放,锁相环,PWM芯片,保护电路等等,极大简化电路,估计也就之前的三分之一。控制的灵活性也非常突出,之前在调试模拟电路的时候,各种麻烦,不停的换电容电阻,现在改成敲代码,之前调试完成板子也就几乎报废了。嘿嘿
在说说缺点,比如这次我只用了F334加一个运放,这样做只能满足低频率,低采样点数,因为我每个周期都采样,所以频率不能超过50K,点数也不能太多,目前保持在100点以内。再多的话或者频率在高的话,就不能每个周期都采样了,采了也处理不过来。但是我这个电源打算做到120K左右,而且也想把精度提高一些,所以我想到了加FPGA+adc,用FPGA做前端运算,F334只做PID算法,这样的话提到100K没有问题。要是F334的主频能到100M以上就完美了。
IMG_20180503_104442.jpg
qiuyuqiang001 回答时间:2018-8-17 19:26:24
budaoweng 发表于 2018-4-21 21:42
昨天把问题解决了,主要是大意了。刚开始我只是想在ADC的中断里看每一次的采样数据,但是ADC的速度提高到1M ...

能帮忙看一下我的问题吗?我的HRTIM CUBE设置了一直没有输出,非常感谢!
https://www.stmcu.org.cn/module/forum/thread-617038-1-1.html
郑志小小超 回答时间:2019-6-5 19:05:00
楼主程序能不能分享下
kniferones 回答时间:2020-3-18 20:45:28
楼主能分享下程序吗?我的hrtim一直没有输出不知道为什么
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版