STM32_ADC

文章详细介绍了STM32微控制器中ADC(模拟到数字转换器)的工作原理,包括并联比较型和逐次逼近型两种主要类型的优缺点。讨论了ADC的关键参数如分辨率、转换时间和精度,并列举了STM32F1、F4、F7和H7系列的ADC特性。此外,还阐述了ADC的转换序列、触发源、中断、DMA请求以及单次和连续转换模式,提供了ADC配置的基本步骤和涉及的HAL库函数。
摘要由CSDN通过智能技术生成

STM32_ADC

一.ADC介绍

ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器

常见类型:

ADC****电路类型

优点

缺点

并联比较型

转换速度最快

成本高、功耗高,分辨率低

逐次逼近型

结构简单,功耗低

转换速度较慢

1.1 并联比较型

分压部分 + 比较部分 + 编码部分

优点:转换速度快

缺点:成本高、功耗高、分辨率低

1.2逐次逼近型

优点:结构简单、低功耗

缺点:转换速度较慢

特点:分辨率和采样速度相互矛盾,分辨率越高,采样速率越低

1.3ADC特性参数

  1. 分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等

  1. 转换时间:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高

  1. 精度:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响

  1. 量化误差:用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差

主要特性

F1

F4

F7

H7

ADC类型

逐次逼近型

分辨率

12位

6/8/10/12位

6/8/10/12位

8/10/12/14/16位

ADC时钟频率

14MHz(max)

36MHz(max)

采样时间

采样时间越长, 转换结果相对越准确, 但是转换速度就越慢

转换时间

与ADC时钟频率、分辨率和采样时间等有关

供电电压

VSSA :0V,VDDA :2.4V~3.6V(全速运行)

参考电压

VREF– :0V,VREF+一般为3.3V

输入电压

VREF–≤VIN≤VREF+

二.ADC转换原理

2.1 ADC框图

F1:

①参考电压/模拟部分电压

②输入通道

③转换序列

④触发源

⑤转换时间

⑥数据寄存器

⑦中断

F4:

①参考电压/模拟部分电压

②输入通道

③转换序列

④触发源

⑤转换时间

⑥数据寄存器

⑦中断

2.2 ADC通道

ADC1

IO

ADC2

IO

ADC3

IO

通道0

PA0

通道0

PA0

通道0

PA0

通道1

PA1

通道1

PA1

通道1

PA1

通道2

PA2

通道2

PA2

通道2

PA2

通道3

PA3

通道3

PA3

通道3

PA3

通道4

PA4

通道4

PA4

通道4

PF6

通道5

PA5

通道5

PA5

通道5

PF7

通道6

PA6

通道6

PA6

通道6

PF8

通道7

PA7

通道7

PA7

通道7

PF9

通道8

PB0

通道8

PB0

通道8

PF10

通道9

PB1

通道9

PB1

通道9

连接内部VSS

通道10

PC0

通道10

PC0

通道10

PC0

通道11

PC1

通道11

PC1

通道11

PC1

通道12

PC2

通道12

PC2

通道12

PC2

通道13

PC3

通道13

PC3

通道13

PC3

通道14

PC4

通道14

PC4

通道14

连接内部VSS

通道15

PC5

通道15

PC5

通道15

连接内部VSS

通道16

连接内部温度传感器

通道16

连接内部VSS

通道16

连接内部VSS

通道17

连接内部Vrefint

通道17

连接内部VSS

通道17

连接内部VSS

2.3 转换序列

A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组)规则组最多可以有16个转换,注入组最多有4个转换

注入组的级别高于规则组

2.4 触发源

(1)ADON位触发转换(仅限F1系列)

当ADC_CR2寄存器的ADON位为1时,再单独给ADON位写1,只能启动规则组转换

(2)外部事件触发转换

外部事件触发转换分为:规则组外部触发和注入组外部触发

F1:

F4/F7:

2.5 转换时间

2.6 中断

中断事件

事件标志

使能控制位

规则通道转换结束

EOC

EOCIE

注入通道转换结束

JEOC

JEOCIE

设置了模拟看门狗状态位

AWD

AWDIE

溢出(F1没有)

OVR

OVRIE

DMA请求(只适用于规则组)

规则组每个通道转换结束后,除了可以产生中断外,还可以产生DMA请求,我们利用DMA及时把转换好的数据传输到指定的内存里,防止数据被覆盖。

2.7 单次转换模式和连续转换模式

CONT位

0

1

转换模式

单次转换模式

连续转换模式

转换组/转换模式

单次转换模式(只触发一次转换)

连续转换模式(自动触发下一次转换)注意:只有规则组才能触发该模式

规则组

转换结果被储存在ADC_DR EOC(转换结束)标志位被置1如果设置了EOCIE位,则产生中断然后ADC停止

转换结果被储存在ADC_DR EOC(转换结束)标志位被置1如果设置了EOCIE位,则产生中断

注入组

转换结果被储存在ADC_DRJxJEOC(转换结束)标志位被置1如果设置了JEOCIE位,则产生中断然后ADC停止

转换结果被储存在ADC_DRJxJEOC(转换结束)标志位被置1如果设置了JEOCIE位,则产生中断自动注入:将JAUTO位置1

2.8 扫描模式

SCAN位

0

1

扫描模式

关闭扫描模式

使用扫描模式

关闭扫描模式

使用扫描模式

ADC只转换ADC_SQRx或ADC_JSQR选中的第一个通道进行转换

ADC会扫描所有被ADC_SQRx或ADC_JSQR选中的所有通道

单次转换模式(不扫描)

只转换一个通道,而且是一次,需等待下一次触发

单次转换模式(扫描)

ADC_SQRx 和ADC_JSQR 选中的所有通道都转换一次

连续转换模式(不扫描)

只会转换一个通道,转换完后会自动执行下一次转换

连续转换模式(扫描)

ADC_SQRx 和ADC_JSQR 选中的所有通道都转换一次,并自动进入下一轮转换

单次转换模式(不扫描)

使用ADC单通道,并要求进行一次转换

单次转换模式(扫描)

使用ADC多通道,并要求所有通道都转换一次就停止

连续转换模式(不扫描)

使用ADC单通道,并要求对该通道连续转换

连续转换模式(扫描)

使用ADC多通道,并要求所有通道都转换一次后,自动启动下一轮转换

三.ADC配置

步骤

操作

函数

1

配置ADC工作参数、ADC校准

HAL_ADC_Init()、HAL_ADCEx_Calibration_Start()

2

ADC MSP初始化

HAL_ADC_MspInit() 配置NVIC、CLOCK、GPIO等

3

配置ADC相应通道相关参数

HAL_ADC_ConfigChannel()

4

启动A/D转换

HAL_ADC_Start()

5

等待规则通道转换完成

HAL_ADC_PollForConversion()

6

获取规则通道A/D转换结果

HAL_ADC_GetValue()

函数

主要寄存器

主要功能

HAL_ADC_Init()

CR1、CR2

配置ADC工作参数

HAL_ADCEx_Calibration_Start()

CR2

ADC校准

HAL_ADC_MspInit()

存放NVIC、CLOCK、GPIO初始化代码

HAL_RCCEx_PeriphCLKConfig()

RCC_CFGR

设置扩展外设时钟,如:ADC、RTC等

HAL_ADC_ConfigChannel()

SQRx、SMPRx

配置ADC相应通道的相关参数

HAL_ADC_Start()

CR2

启动A/D转换

HAL_ADC_PollForConversion()

SR

等待规则通道转换完成

HAL_ADC_GetValue()

DR

获取规则通道A/D转换结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
并联机器人门型轨迹编程需要考虑以下几个步骤: 1. 确定门型轨迹的运动规律和路径,通常可以使用轨迹规划算法来实现,比如三次样条插值、贝塞尔曲线等。 2. 确定机器人各关节的角度变化规律,可以使用逆向运动学算法来实现。 3. 将机器人关节角度与门型轨迹的运动规律相结合,生成机器人的运动轨迹。 4. 将生成的运动轨迹转化为机器人控制指令,以实现机器人的自动化控制。 下面是一个简单的示例代码,用于实现一个四自由度的并联机器人的门型轨迹编程: ```python #-*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt # 机器人参数 L1 = 300.0 L2 = 150.0 L3 = 100.0 L4 = 80.0 # 门型轨迹参数 delta = 100.0 # 门型轨迹高度 T = 10.0 # 门型轨迹周期 # 逆向运动学求解函数 def inv_kinematics(x, y, z): theta1 = np.arctan2(y, x) d = np.sqrt(x*x + y*y) alpha = np.arctan2(z - L1, d) beta = np.arccos((L2*L2 + d*d + (z-L1)*(z-L1) - L3*L3) / (2*L2*np.sqrt(d*d + (z-L1)*(z-L1)))) theta2 = alpha - beta gamma = np.arccos((L2*L2 + L3*L3 - d*d - (z-L1)*(z-L1)) / (2*L2*L3)) theta3 = np.pi - gamma theta4 = np.arctan2(0, -1) return [theta1, theta2, theta3, theta4] # 生成门型轨迹 def generate_trajectory(): t = np.linspace(0, T, 1000) x = 0.5 * delta * np.sin(2*np.pi/T*t) y = 0.5 * delta * np.sin(4*np.pi/T*t) z = L1 + 0.5 * delta * np.cos(2*np.pi/T*t) return x, y, z # 运动规划 def motion_planning(): x, y, z = generate_trajectory() thetas = [] for i in range(len(x)): theta = inv_kinematics(x[i], y[i], z[i]) thetas.append(theta) return np.array(thetas) # 绘制机器人运动轨迹 def plot_trajectory(thetas): T = len(thetas) x = np.zeros(T) y = np.zeros(T) z = np.zeros(T) for i in range(T): theta = thetas[i] x[i] = L2*np.sin(theta[1]) + L3*np.sin(theta[1]+theta[2]) + L4*np.sin(theta[1]+theta[2]+theta[3]) y[i] = L2*np.cos(theta[1]) + L3*np.cos(theta[1]+theta[2]) + L4*np.cos(theta[1]+theta[2]+theta[3]) z[i] = L1 + L2*np.sin(theta[0]) + L3*np.sin(theta[0]) + L4*np.sin(theta[0]) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot(x, y, z, 'b-') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') ax.set_xlim([-500, 500]) ax.set_ylim([-500, 500]) ax.set_zlim([0, 500]) plt.show() # 主函数 if __name__ == '__main__': thetas = motion_planning() plot_trajectory(thetas) ``` 运行以上代码后,会生成一个机器人的门型轨迹运动动画。其中,`inv_kinematics()` 函数用于求解逆向运动学,`generate_trajectory()` 函数用于生成门型轨迹,`motion_planning()` 函数用于运动规划,`plot_trajectory()` 函数用于绘制机器人的运动轨迹。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值