STM32F103控制悬浮球LCD显示位置曲线程序

版权申诉
5星 · 超过95%的资源 1 下载量 35 浏览量 更新于2024-11-10 3 收藏 396KB ZIP 举报
资源摘要信息:"悬浮球+sinD_LCD显示位置曲线_STM32F103_悬浮球_PID正点原子_" 1. STM32F103ZET6介绍 STM32F103ZET6是STMicroelectronics(意法半导体)生产的一款高性能的Cortex-M3微控制器。它拥有高达72MHz的处理速度、丰富的外设接口和大容量的存储空间,广泛应用于各种嵌入式系统中。其产品型号中的“ZET6”表示该微控制器具有较大引脚数和内存容量的特定封装,适合处理复杂的任务和外设控制。 2. 超声波测距模块SR04原理 超声波测距模块SR04是一款常用于距离测量的模块,它利用超声波的反射原理来测量对象与模块之间的距离。模块发出超声波信号,当信号碰到障碍物后反射回来,SR04模块接收回波并计算发出和接收之间的时间差,从而计算出距离。此模块能够测量2cm至400cm的距离,通常精度可达3mm。 3. ILI9341显示屏介绍 ILI9341是一款广泛使用的彩色TFT LCD驱动IC,支持320×240像素分辨率的显示屏幕。它内置了172800字节的显示缓冲区和多种颜色空间转换等功能,因此能够支持多种显示模式。该驱动IC常与各种微控制器配合使用,展示复杂的图形界面,适用于嵌入式显示系统。 4. 悬浮球系统概念 悬浮球系统通常指的是一种利用反馈控制机制(如PID控制)来维持球体在一定位置稳定的系统。这类系统利用传感器来检测球的位置,通过控制算法计算出需要的控制量,再由执行机构(例如电机)调整,以达到对球体位置的精确控制。悬浮球实验在教学和研究中常用于演示控制系统的设计和分析。 5. PID控制原理 PID控制器是一种常见的反馈控制器,它包含比例(Proportional)、积分(Integral)、微分(Derivative)三个基本控制元件。比例控制负责偏差的当前值调节,积分控制负责消除累积偏差,而微分控制则负责预测系统的未来走向并提前做出调整。PID控制器能广泛应用于温度控制、电机速度控制、位置控制等多个领域,是实现精确控制的重要工具。 6. 正点原子例程 正点原子是一个专注于嵌入式学习和开发的平台,为开发者提供了一系列的开发板、例程和教程。正点原子例程是指那些经过预设和优化,可直接用于教学或实验的编程代码和相关文档。通过这些例程,学习者可以快速理解并应用各种硬件和软件知识,加速学习进程。 7. 串口通信 串口通信是指通过串行通信接口进行的数据传输。在本例中,通过串口1进行输入,可以修改PID参数以及悬浮球的目标位置。串口通信因其简单易行、成本低而广泛应用于嵌入式系统的数据交换和程序调试中。 总结以上知识点,本资源所涉及到的主要技术和概念包括STM32F103ZET6微控制器的应用、超声波测距模块SR04的使用、ILI9341显示屏的编程和驱动、悬浮球系统的搭建与控制、PID控制理论与实践、正点原子平台的例程应用,以及串口通信技术在嵌入式系统中的实施。这些知识点的结合,使得本资源成为学习和开发嵌入式系统、特别是涉及到位置反馈控制系统的宝贵资料。

% 创建串口对象 s1 = serial('COM3','BaudRate',115200,'InputBufferSize',40960); s2 = serial('COM5','BaudRate',115200,'InputBufferSize',40960); % 打开串口对象 fopen(s1); fopen(s2); % 设置串口参数 set(s1,'DataBits',8); set(s1,'StopBits',1); set(s1,'Parity','none'); set(s2,'DataBits',8); set(s2,'StopBits',1); set(s2,'Parity','none'); % 读取仰角alpha alpha = fread(s2, 1, 'uint8'); % 读取数据帧 data = fread(s1, 2+2+3*N+2+1, 'uint8'); % 解析数据帧 N = bitand(data(1), 31); % 获取点数 rho = zeros(N,1); % 存储距离值 for i = 1:N rho(i) = double(typecast(uint8(data(6+3*(i-1):7+3*(i-1))), 'uint16'))/1000; % 获取距离值 end % 关闭串口对象 fclose(s1); fclose(s2); % 定义扫描仪位置和方向 scanner_pos = [0, 0, 0]; % 扫描仪中心点位置 scanner_dir = [0, 0, 1]; % 扫描仪方向向量 % 定义坐标转换矩阵 rot_x = [1, 0, 0; 0, cosd(90), -sind(90); 0, sind(90), cosd(90)]; % 绕X轴旋转90度的矩阵 rot_y = [cosd(90), 0, sind(90); 0, 1, 0; -sind(90), 0, cosd(90)]; % 绕Y轴旋转90度的矩阵 rot_z = [cosd(0), -sind(0), 0; sind(0), cosd(0), 0; 0, 0, 1]; % 绕Z轴旋转0度的矩阵 % 定义空间坐标系下的数据点矩阵 data_xyz = zeros(N, 3); % 循环计算每个数据点的空间坐标 for i = 1:N % 计算当前数据点的极坐标 rho_i = rho(i); alpha_i = (i-1) * 360 / N; % 计算当前数据点的方位角和仰角 azimuth = alpha_i; elevation = alpha; % 计算当前数据点的空间坐标 x = rho_i * cosd(elevation) * cosd(azimuth); y = rho_i * cosd(elevation) * sind(azimuth); z = rho_i * sind(elevation); % 将当前数据点的空间坐标转换到扫描仪坐标系下 point_xyz = [x, y, z] * rot_x * rot_y * rot_z; point_xyz = point_xyz + scanner_pos; data_xyz(i, :) = point_xyz; end % 显示点云 scatter3(data_xyz(:,1), data_xyz(:,2), data_xyz(:,3), '.');

2023-05-17 上传

[max_resp_row, max_row] = max(response, [], 1); [init_max_response, max_col] = max(max_resp_row, [], 2); max_row_perm = permute(max_row, [2 3 1]); col = max_col(:)'; row = max_row_perm(sub2ind(size(max_row_perm), col, 1:size(response,3))); trans_row = mod(row - 1 + floor((use_sz(1)-1)/2), use_sz(1)) - floor((use_sz(1)-1)/2); trans_col = mod(col - 1 + floor((use_sz(2)-1)/2), use_sz(2)) - floor((use_sz(2)-1)/2); init_pos_y = permute(2pi * trans_row / use_sz(1), [1 3 2]); init_pos_x = permute(2pi * trans_col / use_sz(2), [1 3 2]); max_pos_y = init_pos_y; max_pos_x = init_pos_x; % pre-compute complex exponential exp_iky = exp(bsxfun(@times, 1i * ky, max_pos_y)); exp_ikx = exp(bsxfun(@times, 1i * kx, max_pos_x)); % gradient_step_size = gradient_step_size / prod(use_sz); ky2 = ky.ky; kx2 = kx.kx; iter = 1; while iter <= iterations % Compute gradient ky_exp_ky = bsxfun(@times, ky, exp_iky); kx_exp_kx = bsxfun(@times, kx, exp_ikx); y_resp = mtimesx(exp_iky, responsef, 'speed'); resp_x = mtimesx(responsef, exp_ikx, 'speed'); grad_y = -imag(mtimesx(ky_exp_ky, resp_x, 'speed')); grad_x = -imag(mtimesx(y_resp, kx_exp_kx, 'speed')); ival = 1i * mtimesx(exp_iky, resp_x, 'speed'); H_yy = real(-mtimesx(bsxfun(@times, ky2, exp_iky), resp_x, 'speed') + ival); H_xx = real(-mtimesx(y_resp, bsxfun(@times, kx2, exp_ikx), 'speed') + ival); H_xy = real(-mtimesx(ky_exp_ky, mtimesx(responsef, kx_exp_kx, 'speed'), 'speed')); det_H = H_yy . H_xx - H_xy . H_xy; % Compute new position using newtons method max_pos_y = max_pos_y - (H_xx .* grad_y - H_xy .* grad_x) ./ det_H; max_pos_x = max_pos_x - (H_yy .* grad_x - H_xy .* grad_y) ./ det_H; % Evaluate maximum exp_iky = exp(bsxfun(@times, 1i * ky, max_pos_y)); exp_ikx = exp(bsxfun(@times, 1i * kx, max_pos_x)); iter = iter + 1; end max_response = 1 / prod(use_sz) * real(mtimesx(mtimesx(exp_iky, responsef, 'speed'), exp_ikx, 'speed')); % check for scales that have not increased in score ind = max_response < init_max_response; max_response(ind) = init_max_response(ind); max_pos_y(ind) = init_pos_y(ind); max_pos_x(ind) = init_pos_x(ind); [max_scale_response, sind] = max(max_response(:)); disp_row = (mod(max_pos_y(1,1,sind) + pi, 2pi) - pi) / (2pi) * use_sz(1); disp_col = (mod(max_pos_x(1,1,sind) + pi, 2pi) - pi) / (2pi) * use_sz(2); end代码详解

2023-06-10 上传