打印
[应用相关]

ADC采集电位器电压,生成PWM--STM32Cube配置RCC

[复制链接]
998|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AD, ADC, PWM, ST, STM
开发板:NUCLEO-G071RB

MCU:STM32G071RBT6,ARMcortex-M0架构,单核32bit,64MHz,SRAM36KB,FLAHS128KB

NUCLEO-G071RB | Mbed

NUCLEO-G071RB - 采用STM32G071RB MCU的STM32 Nucleo-64开发板,支持Arduino和ST morpho连接 - 意法半导体STMicroelectronics

完成一个电位器-ADC-PWM-LED的控制回路,从而通过电位器旋钮改变LED亮度

一.基础配置
1.配置RCC时钟树
使用STM32CubeMX进行时钟源RCC配置的时候,可以选择使用内部时钟或外部时钟。

HSE:高速外部

LSE:低速外部

HSI:高速内部

LSI:低俗内部

当程序对时钟精度要求较高时,通常使用外部时钟。

Disable:禁用外部时钟
BYPASS Clock Resource:外部有源晶振(旁路时钟源)
Crystal/Ceramic Resonator:外部无源晶振(陶瓷晶振)

Crystal/Ceramic Resonator:外部无源晶振(陶瓷晶振)

无源晶振应用场景比较多,无需外部供电。对于Crystal/Ceramic Resonator(晶体/陶瓷晶振),就是外部晶振,一般我们用的都是这个模式。可以看到时钟是“双向”的。



使用特权

评论回复
沙发
尽快回复过|  楼主 | 2023-12-28 14:24 | 只看该作者
BYPASS Clock Resource:外部有源晶振(旁路时钟源)
BYPASS Clock Source有源晶振(旁路时钟源)顾名思义,需要外部供电,由一个引脚输出固定频率波形。
当修改成旁路时钟源模式时,可以在Clock Configuration中看到这个时钟是由外部输入的。

使用特权

评论回复
板凳
尽快回复过|  楼主 | 2023-12-28 14:24 | 只看该作者


Disable:禁用外部时钟
除此之外,我们还可以注意到,不论是Disable,BYPASS Clock Source,Crystal/Ceramic Resonator模式,都可以选用HSI/LSI作为时钟源,所以如果需要用到内部振荡器做时钟源可以直接把这里设为Disable。

使用特权

评论回复
地板
尽快回复过|  楼主 | 2023-12-28 14:25 | 只看该作者
2.配置工程选项


使用特权

评论回复
5
尽快回复过|  楼主 | 2023-12-28 14:25 | 只看该作者
3.配置通信串口
该开发板默认USB-STLINK为串口2与上位机通信,用于打印采集的ADC值


使用特权

评论回复
6
尽快回复过|  楼主 | 2023-12-28 14:25 | 只看该作者
二.配置ADC与PWM输出,并打印到串口
STM32G071的ADC介绍
ADC英文名analog to digital converter,模数转换器,它可以将模拟信号转换为数字信号。
按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。

查阅STM32G071的芯片手册可知,该芯片只有1个逐次逼近型ADC,可配置12/10/8/6bit分辨率
19个通道IN0~IN18,IN12为内部温度Vts,IN13为内部参考电压Vrefint,IN14为电源电压监视Vbat
ADC 的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

使用特权

评论回复
7
尽快回复过|  楼主 | 2023-12-28 14:25 | 只看该作者
ADC具有模拟看门狗特性,可以使用程序检测输入电压是否超出用户定义的阀值上限或者下限。


使用特权

评论回复
8
尽快回复过|  楼主 | 2023-12-28 14:46 | 只看该作者

使用特权

评论回复
9
尽快回复过|  楼主 | 2023-12-28 14:46 | 只看该作者

使用特权

评论回复
10
尽快回复过|  楼主 | 2023-12-28 14:47 | 只看该作者
1.单通道轮询
配置ADC1
该开发板只有一个ADC1

在HCLK处输入其时钟最高频率64,按回车,其余时钟会自动配置好,一般情况下无需改动

使用特权

评论回复
11
尽快回复过|  楼主 | 2023-12-28 14:47 | 只看该作者

使用特权

评论回复
12
尽快回复过|  楼主 | 2023-12-28 14:47 | 只看该作者

这里采用ADC1的通道0,若开启连续采样模式, 开启ADC采样后会连续采样,此时需要手动关闭
    HAL_ADC_Start(&hadc1);                   //连续模式,每次开启ADC需要手动关闭
    HAL_ADC_PollForConversion(&hadc1, 10);   //等待转换完成,10为等待时间
    HAL_ADC_Stop(&hadc1);
    ADC1_value = HAL_ADC_GetValue(&hadc1);   //3.3v  -   1111 1111 1111  - 100% = 1000/1000
    ADC1_volt = ADC1_value * 3.3/4096;       //0     -   0               - 10%  = 100/1000

使用特权

评论回复
13
尽快回复过|  楼主 | 2023-12-28 14:47 | 只看该作者
否则每次开启ADC采样后只进行一次采样,不需要手动关闭HAL_ADC_Stop();

ADC频率为64/2 = 32MHz = 31.25ns
分辨率设置12bit
右对齐方式存储

使用特权

评论回复
14
尽快回复过|  楼主 | 2023-12-28 14:48 | 只看该作者
采样时间1.5个周期

TCONV(转换时间) = 采样时间(设置采样周期SampleTime)+ 12.5个周期,其中12.5个周期是采集12位AD时间,是固定的。        
采样一次需要31.25ns * 14 = 4.375us

使用特权

评论回复
15
尽快回复过|  楼主 | 2023-12-28 14:48 | 只看该作者
可知ADC1/0的引脚位置为PA_0

使用特权

评论回复
16
尽快回复过|  楼主 | 2023-12-28 14:48 | 只看该作者
配置定时器TIM2
采用TIM2通用定时器,设置PWM生成模式
该项目中频率自定义,占空比根据采样电压转换

fTIM = 64MHz / 6400 = 10kHz -100ns
fPWM = 10kHz / 1000 = 10Hz -100ms

使用特权

评论回复
17
尽快回复过|  楼主 | 2023-12-28 14:48 | 只看该作者
如果PWM频率太低,则降低分频值

fTIM = 64MHz / 64 = 1MHz - 1us
fPWM = 1MHz / 1000 = 1kHz - 1ms

比较输出,PWM1向上计数模式下
默认输出高电平,计数器CNT++,直到CNT>CCR捕获比较值,输出低电平,

使用特权

评论回复
18
尽快回复过|  楼主 | 2023-12-28 14:48 | 只看该作者
使用的函数
配置定时器TIM-比较输出pwm

使用特权

评论回复
19
尽快回复过|  楼主 | 2023-12-28 14:49 | 只看该作者
先获取AD值,然后计算采样电压,再转换成占空比


使用特权

评论回复
20
尽快回复过|  楼主 | 2023-12-28 14:49 | 只看该作者
然后通过改变比较值,来改变占空比

函数重定向以后使用print打印数据到串口

使用特权

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

本版积分规则

27

主题

443

帖子

0

粉丝