[应用相关] ADC采集电位器电压,生成PWM--STM32Cube配置RCC

[复制链接]
2200|27
 楼主| 尽快回复过 发表于 2023-12-28 14:24 | 显示全部楼层 |阅读模式
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:外部无源晶振(陶瓷晶振)
95560658d14740de38.png
Crystal/Ceramic Resonator:外部无源晶振(陶瓷晶振)

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

33958658d1483efe19.png

 楼主| 尽快回复过 发表于 2023-12-28 14:24 | 显示全部楼层
BYPASS Clock Resource:外部有源晶振(旁路时钟源)
BYPASS Clock Source有源晶振(旁路时钟源)顾名思义,需要外部供电,由一个引脚输出固定频率波形。
当修改成旁路时钟源模式时,可以在Clock Configuration中看到这个时钟是由外部输入的。 42223658d149ac00b8.png
 楼主| 尽快回复过 发表于 2023-12-28 14:24 | 显示全部楼层
69768658d14a135a55.png

Disable:禁用外部时钟
除此之外,我们还可以注意到,不论是Disable,BYPASS Clock Source,Crystal/Ceramic Resonator模式,都可以选用HSI/LSI作为时钟源,所以如果需要用到内部振荡器做时钟源可以直接把这里设为Disable。
 楼主| 尽快回复过 发表于 2023-12-28 14:25 | 显示全部楼层
2.配置工程选项
12426658d14bc8a3cf.png
96476658d14c13621e.png
81264658d14c5ceb59.png
 楼主| 尽快回复过 发表于 2023-12-28 14:25 | 显示全部楼层
3.配置通信串口
该开发板默认USB-STLINK为串口2与上位机通信,用于打印采集的ADC值


43816658d14d459fb7.png
 楼主| 尽快回复过 发表于 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位数据寄存器中。
 楼主| 尽快回复过 发表于 2023-12-28 14:25 | 显示全部楼层
ADC具有模拟看门狗特性,可以使用程序检测输入电压是否超出用户定义的阀值上限或者下限。


137658d14ebf303a.png
 楼主| 尽快回复过 发表于 2023-12-28 14:46 | 显示全部楼层
 楼主| 尽快回复过 发表于 2023-12-28 14:46 | 显示全部楼层
 楼主| 尽快回复过 发表于 2023-12-28 14:47 | 显示全部楼层
1.单通道轮询
配置ADC1
该开发板只有一个ADC1

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

12702658d19ec9de9d.png
 楼主| 尽快回复过 发表于 2023-12-28 14:47 | 显示全部楼层
 楼主| 尽快回复过 发表于 2023-12-28 14:47 | 显示全部楼层
19167658d19fd01bd6.png
这里采用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
 楼主| 尽快回复过 发表于 2023-12-28 14:47 | 显示全部楼层
否则每次开启ADC采样后只进行一次采样,不需要手动关闭HAL_ADC_Stop();

ADC频率为64/2 = 32MHz = 31.25ns
分辨率设置12bit
右对齐方式存储
67979658d1a17c046b.png
 楼主| 尽快回复过 发表于 2023-12-28 14:48 | 显示全部楼层
采样时间1.5个周期

TCONV(转换时间) = 采样时间(设置采样周期SampleTime)+ 12.5个周期,其中12.5个周期是采集12位AD时间,是固定的。        
采样一次需要31.25ns * 14 = 4.375us
83797658d1a25e6f9c.png
 楼主| 尽快回复过 发表于 2023-12-28 14:48 | 显示全部楼层
可知ADC1/0的引脚位置为PA_0
46358658d1a32abe59.png
 楼主| 尽快回复过 发表于 2023-12-28 14:48 | 显示全部楼层
配置定时器TIM2
采用TIM2通用定时器,设置PWM生成模式
该项目中频率自定义,占空比根据采样电压转换

fTIM = 64MHz / 6400 = 10kHz -100ns
fPWM = 10kHz / 1000 = 10Hz -100ms
 楼主| 尽快回复过 发表于 2023-12-28 14:48 | 显示全部楼层
如果PWM频率太低,则降低分频值

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

比较输出,PWM1向上计数模式下
默认输出高电平,计数器CNT++,直到CNT>CCR捕获比较值,输出低电平,
56469658d1a489a1bb.png
 楼主| 尽快回复过 发表于 2023-12-28 14:48 | 显示全部楼层
使用的函数
配置定时器TIM-比较输出pwm
31786658d1a552aa6a.png
 楼主| 尽快回复过 发表于 2023-12-28 14:49 | 显示全部楼层
先获取AD值,然后计算采样电压,再转换成占空比


6367658d1a639d63c.png
 楼主| 尽快回复过 发表于 2023-12-28 14:49 | 显示全部楼层
然后通过改变比较值,来改变占空比
64206658d1a6f97f10.png
函数重定向以后使用print打印数据到串口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

599

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部