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

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 结帖奖励,很详细,榜样!

查看全部评分

12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版