第8章-解魔方机器人设计_第1页
第8章-解魔方机器人设计_第2页
第8章-解魔方机器人设计_第3页
第8章-解魔方机器人设计_第4页
第8章-解魔方机器人设计_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章解魔方机器人设计目录8.1设计思想8.2材料清单8.3电路设计

8.1设计思想

智能机器人技术随着机器人学、计算机科学、计算机视觉等学科的发展,应用范围和使用价值得到了非常广泛的关注和提高,成为当今世界高科技领域备受关注的热点课题。近年来智能机器人逐渐走进人类的日常生产和生活,而解魔方机器人因其无与伦比的趣味性和炫酷的交互性,正成为人工智能的研究热点。由于解魔方机器人融合了计算机视觉、图像处理、机器人控制技术、虚拟现实交互、魔方算法等多学科知识,因此实现一个快速、稳定的解魔方机器人具有很大的挑战性。

本项目的魔方机器人通过设计稳定的机械结构,采用当今世界上复原步数最少的Kociemba算法,优化传统的通过设定阈值的颜色识别策略,极大提高了整个系统工作的稳定性。通过优化魔方复原指令解析算法,进一步减少了魔方复原指令解析得到的舵机执行步数。魔方机器人在复原魔方的快速性和稳定性两方面都达到了很好的效果,复原魔方平均不会超过70秒,达到了魔方机器人设计的预期。通过本项目的训练可以锻炼学生的电路连接、元器件搭载、程序调试、传感器运用、算法调用及优化等多方面能力,能够将工科学生之前学到的相关课程进行一次梳理和整合,教会学生如何学以致用,并能够激发学生的学习兴趣和创新热情。8.2材料清单材料清单如表8-1所示

表8-1材料清单上述清单中的材料中有几处需要特别注意:1.第2,3,4项本项目使用的是自行建模3D打印的零件,主要目的是降低开发成本。如果有同学想追求更好的性能,可以联系淘宝进行定制,定制件具有精准性更高等优点。2.第7项中的数字舵机,各位同学也可以根据实际需求选择市面上的数字舵机,推荐使用NG995,55g舵机,本舵机可以在同等电压下旋转180度的时间更短,极大地提升了魔方的还原速度。但是不建议同学们选用模拟舵机,因为模拟舵机需要不断的接受舵机控制器发送的PWM信号才能保持锁定角度,完成相应的操作,并且精度较差,线性度很难达标。而数字舵机仅需接受一次舵机控制器传递的PWM信号就可以锁定角度不变,控制精度较高、线性度良好、相应速度快,能够完成本项目的各项功能需要。特别值得注意的是,并不是舵机的转动角度越大越好,同学们不要选用360度舵机,因为目前市面的无死角舵机绝大部分无法接受PWM信号控制,不能锁定角度不变,一经上电会不停旋转。3.本项目1和22项为特殊定制件。需要同学们注意相关的细节问题,以免由于个人疏忽造成不必要的经济损失。4.第36项是STM32系统的专用仿真器,仿真器购买时需注意对应的型号和相应配置,如果型号和stm32开发板不匹配则无法进行数据的下载和导入。8.3机械零件设计以下为亚克力定制工程图,因为考虑项目整体的可塑性和便携性,不建议用钢板、塑料等其他材料。选用亚克力板作为本设计的底盘是因其材料具有较好的透明性、易加工、不容易变形,表面光泽度较高,成本相对较低等优点。滑块增高块图如图8-1所示、机械手工程图如图8-2所示、基板工程图如图8-3所示、基板工程图细节如图8-4所示。

图8-1滑块增高块图

图8-2机械手工程图

图8-3基板工程图

图8-4基板工程图细节

图纸中所有单位均为

mm,比例为

1:1,透明亚克力材质。

具体参数要求:

1.滑块增高块厚度为

30mm,数量4个。

2.机械手厚度为10mm,数量4个。

3.基板厚度为8mm,数量1个。

本项目的连接条和转魔方的机械手根据硬度和韧性的要求选择使用PLA材料。即通过自主建模,通过3D打印制作完成。以下为3D打印件工程图。连接条如图8-5所示,机械手如图8-6所示。图8-5连接条图8-6机械手进行3D打印材料时,应该尽量选用质量好的PLA耗材,这样才能保证成品的质量。一般耗材选择1.75MM,公差不超过±0.02mm的材料。另外,3D打印机原则上是选用精度越高的越好,但是同学们往往接触到的都是入门级别的设上述零件图各插口没有做的特别细小,一般的打印机都可以完成。上述零件打印的最低要求标准是机器打印精度0.2mm,打印层高0.4mm8.4电路设计8.4.1硬件框图1.魔方机器人设计方案主要的系统组成

手机app主要功能是颜色识别过程中获取魔方六个面的六张图片,STM32通过控制舵机让魔方旋转到特定的角度,ArduinoMega2560实现了STM32和各个传感模块之间的数据交换,其通过控制蓝牙模块实现了人对魔方机器人的各种控制,并利用蓝牙手机端APP来完成魔方复原的核心工作。魔方复原全过程如图8-8所示。图8-8魔方复原全过程

图8-9魔方机器人硬件电路框图设计

硬件电路设计部分主要是STM32和Arduino进行数据交换,通过视觉模块将信息逐步传递,根据移植的相应算法进行计算,将具体的步骤以指令的形式转给主控器,主控器将具体命令通过蓝牙模块发出,驱动舵机运作,最终实现对魔方的转动。如图8-9所示。7.4V的锂电池为整个STM32和2560硬件系统供电,经XL4015E1稳压电路降为6.0V为舵机供电,AMS1117稳压电路将锂电池电压降为3.3V为STM32和2560供电。蓝牙串口模块可以实现蓝牙协议和串口协议的转换,很方便地实现了STM32和2560进行数据传输。本项目用舵机两两一组构成曲柄滑块的机械结构作为复原魔方的机械手,8个舵机构成四组机械手。硬件系统实物图如图8-10所示。图8-10魔方机器人硬件系统实物图STM32和2560电路模块设计

魔方机器人的电路设计较为简单,本文只简要介绍

XL4015E1

稳压电路图8-11XL4015E1

稳压电路本项目使用的舵机的驱动电流较大,每个舵机的驱动电流大约为500mA,8个舵机同时驱动需要至少4A的驱动电流,,舵机的驱动电压为4.8V-6.5V。XL4015E1是一款输出电压可调的开关电源稳压器,最大输出电流为5A,输出电压为1.25V-32V,可以满足舵机的驱动电流和电压需求。XL4015E1开关频率为180KHZ,能量转换效率高达96%,负载调整率<0.8%,电压调整率<0.8%。图8-11是XL4015E1稳压电路的原理图。输出电压的计算公式为:VOUT=1.25*(1+R1/R2)公式中1.25为参考电压,单位为V,R1的阻值为固定值10K,R2为可调电阻,最大阻值为10K,当输出电压为6.0V时,R2的阻值约为2.6K。8.4.2

魔方算法Kociemba算法及其优化本图是本文移植的Kociemba算法Java测试软件。按钮Scramble可以随机打乱一个魔方,并在界面中显示出来,MoveLimit设定复原魔方公式的最大步数,TimeLimit设定复原的最大时间。按钮SolveCube运行Kociemba算法并生成复原公式,当超过设定的时间还没有解算出来或者设定的步数过短时,软件会有提示。图8-12

测试软件主界面测试软件的主界面是魔方六个面的展开图,如图8-12所示。魔方中心块上的字母代表这个面所处的方位:F(front)代表前面,B(back)代表后面,L(left)代表左面,R(right)代表右面,U(up)代表上面,D(down)代表下面。一个魔方共有6种颜色,某种颜色的颜色标号用中心块为该颜色的面所处的方位(F、B、L、R、U、D)来表示。Kociemba算法的输入参数即为魔方54个颜色块的标号排列,颜色标号的排列按照一定的顺序,六个面的顺序依次为上、右、前、下、左、后,每个面的标号排列按照从上到下,从左到右的顺序。8.4.3Kociemba算法的优化Kociemba魔方复原算法运行时,总会挑选近似最优的解输出。据多次(大于15次)测试统计,单次运行算法时,输出的复原公式平均有21步,舵机执行此复原公式的平均步数为144步。算法运行一次输出是近似最优解,解算时间平均为10ms。为了取得最优的复原公式,系统在保证时间高效的同时,必须寻找出最优解。正常情况下,运行时间越长,Kociemba魔方复原算法更有可能取得最优解。当运行Kociemba算法时间足够长时,一定会找出最优解,最优解能通过减少舵机执行步数来缩短魔方复原时间。但是减少的时间能不能抵消掉Kociemba算法多次运行带来的时间消

耗,这个还需要数据的测试。为了测试以取得最优模型,我们增加了“限时取解”的逻辑:让Kociemba算法连续运行t秒的时间,获取得到最优解,然后通过对比寻找最优解的时间消耗与最优解带来的的时间收益,来判断“限时取解”是否是一种可行的方法。测试过程中,我们取限制时间t为0.4S和远大于0.4S的时间,如5S,同时我们统计出每次运行算法得到的复原公式对应的舵机步数。

通过多次测试统计得出:1.Kociemba算法连续运行0.4秒或超过0.4秒的时,能获取到最优解,并且运行0.4秒与运行超过0.4秒两种情形下取得的最优解执行效率相差不大。2.连续运行0.4秒时,Kociemba算法取得的最优解大大减少了舵机运行步数,舵机执行最优解时平均步数为116步,最优解带来的时间收益大于寻找最优解花费的时间消耗。基于以上两个特点可以推断出:连续运行0.4秒的时间,足以使Kociemba算法找出魔方复原的最优解,所以“限时取解”模型是一种可行的方法。当限制时间t等于0.4S时,对“限时取解”模型的优化效果做了测试,从图中可以看出,平均舵机步数优化比例为20%,优化效果较为可观。Kociemba算法限时取解测试数据如图8-13所示。图8-13Kociemba

算法限时取解测试数据8.4.4魔方复原指令的优化

魔方机器人有两套指令系统,第一套指令系统是现在世界各地的解魔方教程中所使用的一套复原指令系统,也就是Kociemba算法得到的复原指令中使用的指令系统,第二套指令系统是我们的魔方机器人在执行魔方复原时用到的指令系统。其实对于复原指令优化程序来说,一方面是通过优化指令缩短魔方复原的时间,另一方面也是把第一套指令系统转变为第二套指令系统,这样STM32才能在接收到指令后进行解析,复原魔方。所以第一套指令系统我们称为未优化指令系统,第二套指令系统我们称为优化后指令系统。

未优化指令系统图表给出了魔方机器人的未优化指令系统,共有18种单指令。表中字母L(left)代表左面,R(right)代表右面,F(front)代表前面,B(back)代表后面,U(up)代表上面,D(dowm)代表下面。字母后面加’代表逆时针旋转90度,例如F’表示将魔方的前面逆时针旋转90度,单独一个字母表示顺时针旋转90度,字母后面有数字2表示将相应的面旋转180度,由于逆时针旋转180度和顺时针旋转180度的效果是一样的,所以不做区分。

优化后指令系统

此图表给出了魔方机器人优化后指令系统,共有16种单指令。指令系统中所有和未优化指令系统相同的指令表示的含义也相同,优化后指令系统中字母后面加^和未优化指令系统中单字母表示的含义相同。两个字母相同的代表翻转指令,例如:LL代表把魔方向左翻转90度。8.4.5硬件系统连接1.下位机连接如下图8-14所示、图8-14下位机连接图此处同学们需要注意的是电源端的地线必须和stm32的GND相连舵机信号线分别连接PA1到PA8Stm32单片机驱动舵机代码:编程环境为keil使用语言为c语言。作者使用的软件版本为Vision4,具体内容如下。#include"stm32f10x.h"#include"movement.h"#include"motor.h"#include"usart.h"#include"instruction.h“staticconstu16original_position[4]={1430,1440,1390,1500};staticconstu16clockwise90_position[4]={580,540,545,660};staticconstu16anticlockwise90_position[4]={2310,2440,2345,2470};staticconstu16clockwise180_position[4]={2270,2310,2340,2340};staticconstu16wrasp_position[4]={1940,1638,1780,1678};staticconstu16loosen_position[4]={1410,1155,1230,1125};

u16lines_num=0;u16initial_position[8];u16firpic_position[5][8];u16secpic_position[2][8];u16thirpic_position[5][8];u16fourpic_position[2][8];u16fifpic_position[5][8];u16sixpic_position[2][8];u16retuinit_position[5][8];u16r_clockwise90[4][8];u16l_clockwise90[4][8];u16f_clockwise90[4][8];u16b_clockwise90[4][8];u16r_anticlockwise90[4][8];u16l_anticlockwise90[4][8];u16f_anticlockwise90[4][8];u16b_anticlockwise90[4][8];u16r_clockwise180[4][8];u16l_clockwise180[4][8];u16f_clockwise180[4][8];u16b_clockwise180[4][8];

u16overturnto_f[6][8];u16overturnto_b[6][8];u16overturnto_l[6][8];u16overturnto_r[6][8]voidInit_TotalArray(void){ Calcul_InitPosition(); Calcul_FirPicPosition();Calcul_SecPicPosition();Calcul_ThirPicPosition();Calcul_FourPicPosition();

Calcul_SixPicPosition();

RetuIni_AftPic(); Calcul_Lclockwise90(); Calcul_Rclockwise90(); Calcul_Fclockwise90(); Calcul_Bclockwise90();Calcul_Lanticlockwise90(); Calcul_Ranticlockwise90(); Calcul_Fanticlockwise90(); Calcul_Banticlockwise90();Calcul_Lclockwise180();Calcul_Rclockwise180(); Calcul_Fclockwise180(); Calcul_Bclockwise180();

Calcul_OverturntoB(); Calcul_OverturntoF(); Calcul_OverturntoL(); Calcul_OverturntoR();

voidCalcul_InitPosition(void){ u8i,j; for(i=0;i<4;i++) {nitial_position[i]=original_position[i]; } for(i=4,j=0;i<8;i++,j++) { initial_position[i]=wrasp_position[j];

}

}voidInit_MotorMovement(void){

u8i;for(i=0;i<8;i++) { pos[0][i]=initial_position[i]; }for(i=0;i<4;i++)

{ pos[1][i]=initial_position[i]; }

for(i=0;i<4;i++) {

pos[1][i+4]=loosen_position[i]; } lines_num=1; }

voidCalcul_FirPicPosition(void){ u8i;for(i=0;i<8;i++)

{firpic_position[0][i]=initial_position[i];

}for(i=0;i<8;i++)

{ firpic_position[1][i]=initial_position[i]; } firpic_position[1][5]=loosen_position[1]; firpic_position[1][7]=loosen_position[3];

for(i=0;i<8;i++) {firpic_position[2][i]=initial_position[i]; } for(i=0;i<8;i++) {

firpic_position[3][i]=firpic_position[2][i]; } firpic_position[3][5]=loosen_position[1]; firpic_position[3][7]=loosen_position[3];for(i=0;i<8;i++) {firpic_position[4][i]=firpic_position[3][i];

}

firpic_position[4][0]=clockwise90_position[0]; firpic_position[4][2]=anticlockwise90_position[2];}voidCalcul_SecPicPosition(void){ u8i; for(i=0;i<8;i++){secpic_position[0][i]=firpic_position[4][i];

}for(i=0;i<8;i++) {secpic_position[1][i]=secpic_position[0][i];

}secpic_position[1][0]=anticlockwise90_position[0];secpic_position[1][2]=clockwise90_position[2]; }voidCalcul_ThirPicPosition(void){ u8i; for(i=0;i<8;i++) { thirpic_position[0][i]=secpic_position[1][i];}

for(i=0;i<8;i++)

{

thirpic_position[1][i]=thirpic_position[0][i]; }thirpic_position[1][5]=wrasp_position[1];thirpic_position[1][7]=wrasp_position[3];for(i=0;i<8;i++) {thirpic_position[2][i]=thirpic_position[1][i]; } thirpic_position[2][4]=loosen_position[0]; thirpic_position[2][6]=loosen_position[2];for(i=0;i<8;i++){thirpic_position[3][i]=thirpic_position[2][i];}

thirpic_position[3][0]=original_position[0]; thirpic_position[3][2]=original_position[2]; for(i=0;i<8;i++) {thirpic_position[4][i]=thirpic_position[3][i];}

thirpic_position[4][1]=clockwise90_position[1]; thirpic_position[4][3]=anticlockwise90_position[3];

}voidCalcul_FourPicPosition(void){

u8i; for(i=0;i<8;i++){ fourpic_position[0][i]=thirpic_position[4][i];

}

for(i=0;i<8;i++){

fourpic_position[1][i]=fourpic_position[0][i];

}

fourpic_position[1][1]=anticlockwise90_position[1]; fourpic_position[1][3]=clockwise90_position[3];

}voidCalcul_FifPicPosition(void){

u8i; for(i=0;i<8;i++)

{fifpic_position[0][i]=fourpic_position[1][i];}for(i=0;i<8;i++){ fifpic_position[1][i]=fifpic_position[0][i]; }fifpic_position[1][4]=wrasp_position[0];

fifpic_position[1][6]=wrasp_position[2]; for(i=0;i<8;i++){

fifpic_position[2][i]=fifpic_position[1][i];}

fifpic_position[2][5]=loosen_position[1]; fifpic_position[2][7]=loosen_position[3]; for(i=0;i<8;i++) { fifpic_position[3][i]=fifpic_position[2][i];

}fifpic_position[3][1]=original_position[1]; fifpic_position[3][3]=original_position[3]; for(i=0;i<8;i++) {fifpic_position[4][i]=fifpic_position[3][i];

} fifpic_position[4][0]=clockwise90_position[0]; fifpic_position[4][2]=anticlockwise90_position[2];}voidCalcul_SixPicPosition(void){u8i;

for(i=0;i<8;i++){

sixpic_position[0][i]=fifpic_position[4][i]; }for(i=0;i<8;i++) { sixpic_position[1][i]=sixpic_position[0][i];

} sixpic_position[1][0]=anticlockwise90_position[0] sixpic_position[1][2]=clockwise90_position[2]; }voidRetuIni_AftPic(void){

u8i;for(i=0;i<8;i++){ retuinit_position[0][i]=sixpic_position[1][i]; } for(i=0;i<8;i++){

retuinit_position[1][i]=retuinit_position[0][i];} retuinit_position[1][5]=wrasp_position[1];retuinit_position[1][7]=wrasp_position[3];for(i=0;i<8;i++)

{ retuinit_position[2][i]=retuinit_position[1][i];

}retuinit_position[2][4]=loosen_position[0];retuinit_position[2][6]=loosen_position[2];for(i=0;i<8;i++){retuinit_position[3][i]=retuinit_position[2][i];}retuinit_position[3][0]=original_position[0];retuinit_position[3][2]=original_position[2];for(i=0;i<8;i++){ retuinit_position[4][i]=retuinit_position[3][i];}retuinit_position[4][4]=wrasp_position[0];retuinit_position[4][6]=wrasp_position[2];}

voidPicArray_ToBufferArray(u16(*array)[8],u16arrayline_num){

u8i,j;lines_num=arrayline_num; for(j=0;j<=lines_num;j++){for(i=0;i<8;i++){ pos[j][i]=*(*(array+j)+i); }}

}voidCalcul_Lclockwise90(void){ u8i; for(i=0;i<8;i++) {l_clockwise90[0][i]=initial_position[i];

} l_clockwise90[0][1]=anticlockwise90_position[1];for(i=0;i<8;i++){

l_clockwise90[1][i]=l_clockwise90[0][i];

} l_clockwise90[1][5]=loosen_position[1];for(i=0;i<8;i++){l_clockwise90[2][i]=l_clockwise90[1][i];}

l_clockwise90[2][1]=original_position[1];for(i=0;i<8;i++){

l_clockwise90[3][i]=l_clockwise90[2][i];

}l_clockwise90[3][5]=wrasp_position[1]; }voidCalcul_Lanticlockwise90(void){

u8i;

for(i=0;i<8;i++) {l_anticlockwise90[0][i]=initial_position[i];

} l_anticlockwise90[0][1]=clockwise90_position[1]; for(i=0;i<8;i++) { l_anticlockwise90[1][i]=l_anticlockwise90[0][i];

} l_anticlockwise90[1][5]=loosen_position[1];

for(i=0;i<8;i++){

l_anticlockwise90[2][i]=l_anticlockwise90[1][i];

}

l_anticlockwise90[2][1]=original_position[1];for(i=0;i<8;i++) { l_anticlockwise90[3][i]=l_anticlockwise90[2][i];

} l_anticlockwise90[3][5]=wrasp_position[1];}voidCalcul_Lclockwise180(void){u8i; for(i=0;i<8;i++){

l_clockwise180[0][i]=initial_position[i]; }

l_clockwise180[0][1]=clockwise180_position[1];for(i=0;i<8;i++){

l_clockwise180[1][i]=l_clockwise180[0][i];}

l_clockwise90[1][5]=loosen_position[1];for(i=0;i<8;i++) { l_clockwise180[2][i]=l_clockwise180[1][i];}

l_clockwise180[2][1]=original_position[1]; for(i=0;i<8;i++){

l_clockwise180[3][i]=l_clockwise180[2][i];

} l_clockwise180[3][5]=wrasp_position[1];}

voidCalcul_OverturntoL(void){

u8i;for(i=0;i<8;i++) { overturnto_l[0][i]=initial_position[i];}

overturnto_l[0][5]=loosen_position[1];

overturnto_l[0][7]=loosen_position[3];for(i=0;i<8;i++){overturnto_l[1][i]=overturnto_l[0][i];}

overturnto_l[1][0]=anticlockwise90_position[0];

overturnto_l[1][2]=clockwise90_position[2];

for(i=0;i<8;i++){

overturnto_l[2][i]=overturnto_l[1][i];

}overturnto_l[2][5]=wrasp_position[1]; overturnto_l[2][7]=wrasp_position[3];for(i=0;i<8;i++){

overturnto_l[3][i]=overturnto_l[2][i];}

overturnto_l[3][4]=loosen_position[0];

overturnto_l[3][6]=loosen_position[2];

for(i=0;i<8;i++){

overturnto_l[4][i]=overturnto_l[3][i];} overturnto_l[4][0]=original_position[0]; overturnto_l[4][2]=original_position[2]; for(i=0;i<8;i++){overturnto_l[5][i]=overturnto_l[4][i];}overturnto_l[5][4]=wrasp_position[0]; overturnto_l[5][6]=wrasp_position[2];}voidCalcul_Rclockwise90(void){

u8i; for(i=0;i<8;i++){

r_clockwise90[0][i]=initial_position[i];}

r_clockwise90[0][3]=anticlockwise90_position[3]; for(i=0;i<8;i++){

r_clockwise90[1][i]=r_clockwise90[0][i];}

r_clockwise90[1][7]=loosen_position[3]; for(i=0;i<8;i++){r_clockwise90[2][i]=r_clockwise90[1][i];}r_clockwise90[2][3]=original_position[3];for(i=0;i<8;i++){r_clockwise90[3][i]=r_clockwise90[2][i];}

r_clockwise90[3][7]=wrasp_position[3];}voidCalcul_Ranticlockwise90(void){

u8i; for(i=0;i<8;i++){r_anticlockwise90[0][i]=initial_position[i]; }r_anticlockwise90[0][3]=clockwise90_position[3]; for(i=0;i<8;i++){ r_anticlockwise90[1][i]=r_anticlockwise90[0][i];} r_anticlockwise90[1][7]=loosen_position[3]; for(i=0;i<8;i++){ r_anticlockwise90[2][i]=r_anticlockwise90[1][i];

} r_anticlockwise90[2][3]=original_position[3];for(i=0;i<8;i++) {

r_anticlockwise90[3][i]=r_anticlockwise90[2][i];

} r_anticlockwise90[3][7]=wrasp_position[3];}voidCalcul_Rclockwise180(void){ u8i; for(i=0;i<8;i++){r_clockwise180[0][i]=initial_position[i];}

r_clockwise180[0][3]=clockwise180_position[3];

for(i=0;i<8;i++){

r_clockwise180[1][i]=r_clockwise180[0][i];}

r_clockwise180[1][7]=loosen_position[3];}

void

TIM4_Int_Init(u16

arr,u16

psc)

{

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

NVIC_InitTypeDef

NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,

ENABLE);TIM_TimeBaseStructure.TIM_Period

=

arr;

TIM_TimeBaseStructure.TIM_Prescaler

=psc;

TIM_TimeBaseStructure.TIM_ClockDivision

=

TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode

=

TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4,

&TIM_TimeBaseStructure);

TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE

);

NVIC_InitStructure.NVIC_IRQChannel

=

TIM4_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority

=

0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority

=

2;

NVIC_InitStructure.NVIC_IRQChannelCmd

=

ENABLE;

NVIC_Init(&NVIC_InitStructure);

TIM_Cmd(TIM4,

DISABLE);

}void

TIM3_Set_Time(u16

arr)

{

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

arr--;

TIM_TimeBaseStructure.TIM_Period

=

arr;

TIM_TimeBaseStructure.TIM_Prescaler

=71;

TIM_TimeBaseInit(TIM3,

&TIM_TimeBaseStructure);

}

void

TIM4_Set_Time(u16

arr)

{

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

arr--;

TIM_TimeBaseStructure.TIM_Period

=

arr;

void

TIM3_IRQHandler(void)

{

static

u8

i=1;

if

(TIM_GetITStatus(TIM3,

TIM_IT_Update)

!=

RESET)

{flag_vpwm=1;

switch(i)

{case

1:

{PWM1=1;

TIM3_Set_Time(pwm[0]);

}

break;

case

2:

{

PWM1=0;

TIM3_Set_Time(2500-pwm[0]);

flag_vpwm=1;

}

break;

case

3:

{

PWM2=1;

TIM3_Set_Time(pwm[1]);

}

break;

case

4:

{PWM2=0;

TIM3_Set_Time(2500-pwm[1]);

flag_vpwm=1;

}

break;

case

5:

{

PWM3=1;

TIM3_Set_Time(pwm[2]);

}

break;

case

6:

{

PWM3=0;

TIM3_Set_Time(2500-pwm[2]);

flag_vpwm=1;

}break;

case

7:

{

PWM4=1;

TIM3_Set_Time(pwm[3]);

}break;

case

8:

{

PWM4=0;

TIM3_Set_Time(2500-pwm[3]);

flag_vpwm=1;

}break;

case

9:

{

PWM5=1;

TIM3_Set_Time(pwm[4]);

}break;

case

10:

{PWM5=0;

TIM3_Set_Time(2500-pwm[4]);

flag_vpwm=1;

}break;

case

11:

{

PWM6=1;

TIM3_Set_Time(pwm[5]);

}break;

case

12:

{

PWM6=0;

TIM3_Set_Time(2500-pwm[5]);

flag_vpwm=1;

}break;

case

13:

{

PWM7=1;

TIM3_Set_Time(pwm[6]);

}break;

case

14:

{

PWM7=0;

TIM3_Set_Time(2500-pwm[6]);

flag_vpwm=1;

}break;

case

15:

{

PWM8=1;

TIM3_Set_Time(pwm[7]);

}break;

case

16:

{PWM8=0;

TIM3_Set_Time(2500-pwm[7]);

flag_vpwm=1;

i=0;

}break;

default:break;

}

i++;

}

2.ArduinoMega2560和STM32硬件连接图

连接图如图8-15所示。图8-15ArduinoMega2560和stm32通信图ArduinoMega2560的调试代码如下:intIntly=Serial1.read();Intabcd=Serial.read();voidsetup(){Serial.begin(9600);Serial1.begin(9600);}voidloop(){//putyourmaincodehere,torunrepeatedly:Serial.print(ly);//Serial1.print(abcd);}Stm32代码:#if1#pragmaimport(__use_no_semihosting)struct__FILE{ inthandle;};

FILE__stdout;_sys_exit(intx){ x=x;}

intfputc(intch,FILE*f){ while((USART1->SR&0X40)==0);USART1->DR=(u8)ch; returnch;}#endifvoidUSART1_Config(void){ GPIO_InitTypeDefGPIO_InitStructure; USART_InitTypeDefUSART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure);

USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_Init(USART1,&USART_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); /*EnablesUSART1interrupts,USART_IT_RXNE:ReceiveDataregisternotemptyinterrupt*/ USART_Cmd(USART1,ENABLE);

NVIC_USART1_Configuration();

}

u8num_to_asc(u8num) { u8asc; switch(num) {case0:asc=0x30;break; case1:asc=0x31;break; case2:asc=0x32;break; case3:asc=0x33;break; case4:asc=0x34;break; case5:asc=0x35;break; case6:asc=0x36;break; case7:asc=0x37;break; case8:asc=0x38;break; case9:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论