[STM32U5]

【STM32U599J-DK测评】屏幕滑动变阻器PWM控制LED亮度

[复制链接]
1469|3
手机看帖
扫描二维码
随时随地手机跟帖
HonestQiao|  楼主 | 2024-2-28 10:38 | 显示全部楼层 |阅读模式
本帖最后由 HonestQiao 于 2024-3-5 17:00 编辑

#申请原创# 在这片测评分享中,通过在STM32U599J-DK设置一个滑动变阻器,通过拨动滑片的位置,来调整PWM的输出,从而控制LED的亮度。

一、了解滑动变阻器
640.gif
640.jpeg


滑动变阻器共有四个接线柱。
使用时,选择“一上一下”两个接线柱连线。
选择不同的接线柱,滑动变阻器阻值变化特点不同。

判断滑动变阻器电阻变化规律的方法:
先判断滑片哪侧的电阻线连入了电路中;再判断滑片向某方向滑动时,连入电路的电阻线长度会变长还是变短;最后确定电阻是变大还是变小。

二、TIM16定时器了解
从STM32U59xx手册可以了解到,可供使用的定时器:
4724265de8efd8d92d.png

通过手册还能了解到,TIM16_CH1,可以输出到PE0:
6310265de8f4d89d92.png

而通过 STM32U599J-DK 的手册可以了解到,PE0连接到了绿色的用户LED:
3457265de8f71a2c3b.png

因此,可以再程序中,利用TIM6来输出PWM控制板载绿色LED的亮度。

另外,定时器涉及到预分频,因此还需要了解TIM16使用的clock:
7000365de94782f278.png
3013065de9498e2281.png
从上可以看出TIM16挂载APB2上,使用PLCK2。

三、TouchGFX界面设计
1. 准备图片:
首先准备好三张图片:
8822965de9065df6d1.png
第一张为底图,第二张为滑动变阻器的图,第三张为滑动变阻器滑片的图:
8736665de907e8a867.png 9515365de908200df1.png 705365de90859dc58.png

2. 将图片添加到工程
新建一个STM32U599J-DK的工程,然后将图片都添加到工程中:
6803165de90efedc54.png

3. 设置底图
添加一个Image到Screen1,然后设置使用底图图片
1583465de910391484.png

4. 添加Slider
1715865de913271872.png

Slider分为三个部分,分别是默认图片,滑动后的图片,以及滑片的图片,依次设置如下:
3461465de9155e12eb.png
5182065de9162da811.png

使用滑动变阻器的图片设置到Slider后,就能够在屏幕上显示一个滑动变阻器了。

调整好滑动变阻器的位置,并设置好滑片的活动范围,以及对应的值的范围:
8303165de9169d4b3f.png

5. 模拟运行查看效果
STM32U599J-DK_滑动变阻器.gif

6. 设置回调
滑动变阻器Slider值改变时,我们需要在程序中知道,并使用该值来改变PWM的占空比,所以需要进行如下设置:
4558765de92e5aa7b5.png

7. 输出代码
点击右下角的代码图标,输出代码:
6264765de938f35e84.png
然后点击左则的Files,查看项目文件:
7035465de939b588c7.png

四、STM32CubeIDE开发
使用TouchGFX进行界面设计,已经完成了大部分的工作。
在STM32CubeIDE中,只需要启用TIM16,并且和滑片的回调关联起来,就可以了。

1. 进入STM32CubeMX设置
在STM32CubeIDE中,点击打开ioc文件,通过STM32CubeMX进行硬件设置:
4638465de93b38a869.png


2. 查看系统时钟:
1207965de954f74de9.png
从上图可以看到,PCLK2最大为160MHz

3. 设置TIM16
2496965de960837507.png
7052065de9670e7ebc.png

因为PCLK2为160MHz,所以这里使用160分频,TIM16工作频率为1MHz。
然后计数1000个周期,刚好就是1KHz,也就是对应1秒。
并设置TIM16使用PWM_CH1输出通道,然后设置PE0使用TIM16_CH1,刚好关联上。

设置完成后,关闭MX设置窗口,会提示生成代码。

4. 修改界面处理代码添加逻辑处理
在输出的代码Screen1ViewBase.cpp中,可以看到TouchGFX界面中,slider1的处理:
2419565de98246beea.png

然后在Screen1View.hpp中,添加对应的调用声明:
6398765de9835b3604.png

在Screen1View.cpp中,添加具体的实现:
1820665de98467bf85.png

在上述代码中,使用了 SIMULATOR 宏定义,这是为了确保在TouchGFX模拟器中,还能继续运行模拟测试。
changePWM中,修改TIM16的CCR1,来修改其实际运行输出的占空比。

5. 启动TIM16
在main.c中,已经有TIM16默认的初始化配置了,我们只需要添加一个启动即可:
5343865de98a5a03a5.png

需要注意的是:
1. 代码要添加到一堆关联的USER CODE BEGIN和USER CODE END之间,否则使用TouchGFX和STM32CubeIMX设计生成后会让你很悲剧的。
2. 启动TIM16的代码,不要放在while(1)之前,否则可能无法运行。

经过以上的处理,相关的工作就完成了,可以编译看看是否有错:
4139065de995dbf02f.png

五、实际效果
编译无误后,下载到开发板实际运行,具体效果如下:
6711965de9a6ed9ee2.png

STM32U599J-DK_滑动变阻器_实际运行.gif

六、参考资料
学习研究的过程中,参考了很多资料,表示感谢:
  • STM32工程师笔记|TIM DMA burst 输出变频 PWM 波形-谷动谷力 (sunsili.com)
  • 初中物理:图解滑动变阻器 (qq.com)
  • STM32cubeMx系列小白学习教程(五)——定时器输出比较(PWM输出)_stm32cube 定时器比较输出-CSDN博客
  • STM32F407+CubeMX-使用TIM产生PWM信号_stm32f4 示波器-CSDN博客
  • STM32 PWM Example - Timer PWM Mode Tutorial – DeepBlue (deepbluembedded.com)
  • 【STM32Cube_12】使用通用定时器产生PWM驱动蜂鸣器_51CTO博客_stm32定时器产生pwm波
  • STM32定时器(TIM)之预分频器(PSC)详解 - 知乎 (zhihu.com)
  • STM32定时器详解(一)系统滴答定时器做延时函数(STM32U5系列为例)(配合cubeMX)_系统滴答定时器与dma-CSDN博客
  • 41、外围设备——STM32U5低功耗定时器 | STMCU中文官网
  • 【STM32Cube笔记】13-使用定时器产生PWM输出_cubeide stm32 利用定时器输出 pwm-CSDN博客
  • 【STM32】通用定时器的PWM输出(实例:PWM输出)_stm32 timer pwm-CSDN博客



使用特权

评论回复
xuanhuanzi| | 2024-2-29 22:34 | 显示全部楼层
真不错,还有动画演示图片

使用特权

评论回复
HonestQiao|  楼主 | 2024-3-1 19:52 | 显示全部楼层
xuanhuanzi 发表于 2024-2-29 22:34
真不错,还有动画演示图片

不能上传视频。

转换后的gif有点大,请耐心等待就能看了!

使用特权

评论回复
问天少年| | 2024-3-11 13:40 | 显示全部楼层
好详细的文章,厉害

使用特权

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

本版积分规则

33

主题

85

帖子

2

粉丝