欢迎来到工友文库! | 帮助中心 工友共享,造福你我!
工友文库
全部分类
  • 行业文库 >
    行业文库
    行业标准 农林牧渔 能源矿业 电力热力 水利环境 材料技术 地理测绘 建筑工程 机械工程 制造加工 交通物流 网络计算 电气机电 信息通讯 汽车行业 航空航天 船舶工程 光电工程 住宿餐饮 财会金融 房地产业 城建规划 装饰装修 家电维修 电商行业 租赁商务 批发零售 居民服务 教育服务 医药卫生 体育行业 公共管理 图书管理 外语翻译 休闲旅游 文艺传媒 其他行业
  • 商业文档 >
    商业文档
    企业计划 工程管理 广告经营 财务报表 物业管理 质控管理 企业文化 绩效管理 商务礼仪 创业孵化 市场营销 经营企划 销售管理 营销创新 资本运营 招商加盟 合同协议 信息管理 励志材料 人事档案 员工关系 薪酬管理 招聘面试 其它文档
  • 办公文书 >
    办公文书
    统计图表 总结报告 演讲致辞 心得体会 述职报告 工作计划 解决方案 调研报告 事务文书 经验事迹 往来文书 规章制度 申请范文 求职简历 活动策划 会议纪要 党建材料 软件教程 其他文书
  • PPT模板库 >
    PPT模板库
    扁平风格 创意新颖 动画效果 动态模板 简约风格 静态模板 环保绿色 卡通风格 立体风格 欧洲风格 手绘风格 创意黑板 相册风格 星空风格 炫酷科技 中国风格 医疗风格 高端商务 工作常用 总结报告 毕业答辩 节日庆典 公益风格 化妆美容 婚礼策划 餐饮美食 培训课件 融资路演 商业策划 英文模板 党政机关 述职竞聘
  • 小学初中 >
    小学初中
    幼儿教育 小学语文 小学数学 小学英语 初中语文 初中数学 初中英语 初中物理 初中化学 初中地理 初中生物 初中政治 初中历史 思想品德 小学竞赛 初中竞赛 其他学科
  • 高中教育 >
    高中教育
    高中语文 高中数学 高中英语 高中物理 高中化学 高中生物 高中地理 高中政治 高中历史 高考资料 高中竞赛 其他学科
  • 高等教育 >
    高等教育
    基础课 艺术类 哲学类 体育类 水利类 测绘类 法学类 历史学 社会学 心理学 教育学 政治学 统计学 房地产 语言文化 生物科学 医药卫生 天文气象 地理科学 环境科学 系统科学 材料科学 机械仪表 图书档案 土建工程 海洋工程 轻工纺织 工程力学 能源动力 光电工程 电力技术 市政工程 财会金融 工商管理 语言文学 广播影视 公安司法 汽车汽修 交通运输 水产加工 植物生产 森林资源 动物科学 食品加工 餐饮旅游 公共事业 新闻传播学 农林业工程 城镇规划管理 水文与水资源 地矿及资源勘查 航空航天与武器 管理科学与工程 农林业经济管理 机电设备及自动化 计算机与信息科学 大学生竞赛资料
  • 执业资格考试 >
    执业资格考试
    财会类考试 建筑类考试 外贸类考试 外语类考试 医药类考试 管理类考试 公务员类考试 司法法律考试 教师资格考试 计算机类考试 公共服务类考试 其他资格证考试
  • 一线采风 >
    一线采风
    一线新闻 事迹宣传 工友作品
  • 教育视频 >
    教育视频
    幼儿教育视频 小学教育视频 初中教育视频 高中教育视频 大学教育视频 C#自学视频教程 软件视频教程 英语视频教学 其他教学视频
  • 换一换
    首页 工友文库 > 资源分类 > DOCX文档下载
     

    基于stm32的风力摆控制系统设计.docx

    • 资源ID:3393       资源大小:1.79MB        全文页数:43页
    • 资源格式: DOCX        下载权限:注册会员/VIP会员    下载费用:2金币 【人民币2元】
    下载资源需要2金币 【人民币2元】
    已注册用户请登录:
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,既可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

    基于stm32的风力摆控制系统设计.docx

    第十二届智能控制设计大赛高级组之 基于stm32的风力摆控制系统 队名 队长 队员 队员 专业及班级 目录 【摘要】3 一、设计要求4 (一)基本要求4 (二)拓展要求4 二、系统的硬件设计与实现5 2.1系统硬件概述5 2.2 主要单元电路的设计5 三、系统的软件设计11 3.1 系统上位机设计11 设计目的11 设计思路12 四、作品展示17 五、设计总结19 六、附录20 附录一 参考文献20 附录二 代码21 【摘要】 1节 长约 60cm70cm 的细管上端用万向节固定在支架上,下方悬挂一组(24只)风机,构成风力摆。风力摆上安装一个向下的激光笔,静止时,激光笔的下端距地面不超过 20cm。 设计一个测控系统,控制各风机使风力摆按照一定规律运动,激光笔在地面画出要求的轨迹。 关键词 stm32,空心杯风机,MPU6050,风力摆 一、设计要求 (一)基本要求 设计一个风力摆的测控硬件系统,具备风机驱动控制、摆杆角度检测等功能; 从静止开始,控制风力摆20秒内做类似自由摆运动,使激光笔在地面画出不短于40厘米,线性偏差小于3cm的直线段; 设计良好的人机界面,对系统的实时数据进行输出并绘制动态曲线,信息包括摆杆运动角速度、实际角度等; (二)拓展要求 1 1.从静止开始,15秒内完成幅度可控的摆动,画出长度在3060厘米间可设置,长度偏差不大于2.5厘米的直线段,并且具有较好的重复性; 2 风力摆在一定角度放开后快速静止,风力摆拉开一定角度,10秒内达到静止; 3 做可控半径的圆周运动,评委指定半径,40秒内重复三圈,轨迹应落在指定半径2.5厘米的圆环内; 4 其他拓展功能; 二、系统的硬件设计与实现 2.1系统硬件概述 本电路是由 STM32 单片机为控制核心,具有操作简单的优点。MPU6050的灵敏度高,操作简单,利用上位机输出显示结果,显示控制的角度和波形 ;空心杯电机的重量低,推重比较强,机动性较高,可以很好实现摆杆的推动效果。 2.2 主要单元电路的设计 2.2.1 单片机主控制模块的设计 STM32F103C8T6单片机STM32F103xx增强型系列使用高性能的ARM Cortex-M3 32位的RISC内核,工作频率为72MHz,内置高速存储器高达128K字节的闪存和20K字节的SRAM,丰富的增强I/O端口和联接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口多达2个I2C和SPI、3个USART、一个USB和一个CAN。 STM32F103xx增强型系列工作于-40C至105C的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。 完整的STM32F103xx增强型系列产品包括从36脚至100脚的五种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。 2.2.2 传感器模块的设计 在本系统中,利用MPU6050传感器获得数据。 MPU-6050 是全球首例9 轴运动处理传感器。它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C 或SPI 接口输出一个9 轴的信号(SPI 接口仅在MPU-6000 可用)。MPU-60X0 也可以通过其I2C 接口连接非惯性的数字传感器,比如压力传感器。 MPU-6050 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为250,500,1000,2000/秒(dps),加速度计可测范围为2,4,8,16g。 一个片上1024 字节的FIFO,有助于降低系统功耗。和所有设备寄存器之间的通信采用400kHz 的I2C 接口或1MHz 的SPI 接口(SPI 仅MPU-6000 可用)。对于需要高速传输的应用,对寄存器的读取和中断可用20MHz 的SPI。 另外,片上还内嵌了一个温度传感器和在工作环境下仅有1变动的振荡器。芯片尺寸440.9mm,采用QFN 封装(无引线方形封装),可承受最大10000g 的冲击,并有可编程的低通滤波器。 关于电源,MPU-6050 可支持VDD 范围2.5V5,3.0V5,或3.3V5。另外MPU-6050 还有一个VLOGIC 引脚,用来为I2C 输出提供逻辑电平。VLOGIC 电压可取1.85或者VDD。 MPU6050引脚和信号描述 2.2.3 空心杯电机动力系统 空心杯电动机在结构上突破了传统电机的转子结构形式,采用的是无铁芯转子,也叫空心杯型转子。这种新颖的转子结构彻底消除了由于铁芯形成涡流而造成的电能损耗,同时其重量和转动惯量大幅降低,从而减少了转子自身的机械能损耗。由于转子的结构变化而使电动机的运转特性得到了极大改善,不但具有突出的节能特点,更为重要的是具备了铁芯电动机所无法达到的控制和拖动特性。 2.2.4 L9110电机驱动芯片原理 L9110电机驱动芯片特点 1. 低静态工作电流; 2. 宽电源电压范围2.5V-12V; 3. 每通道具有800mA连续电流 输出能力; 4. 较低的饱和压降; 5. 输出具有正转、反转、高阻和刹车四种 状态; 6. TTL/CMOS 输出电平兼容,可直接连 CPU; 7. 输出内置钳位二极管,适用于感性负 载; 8. 控制和驱动集成于单片IC之中; 9. 具备管脚高压保护功能; 10. 工作温度-20℃-80℃。 管脚封装如下 L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立 电路集成在单 片IC之中,使外围器件成 本降低,整机可靠性提高。该芯片 有两个 TTL/CMOS 兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的 正反向运动及刹车,它具有较大的电流驱动能力,每通道能通过750~800mA的持续电 流,峰值电流能力可达1.5~2.0A;同时它具有较低的输出饱和压降;内置的钳位二极管能 释放感性负载的反向冲击电流,使它在驱动 继电器、直 流电 机、步进电机或 开关功率 管的使用上安全可靠。L9110被广泛应用于保险柜、玩具汽车的电机驱动、步进电机驱 动和开关功率管等电路上。 三、系统的软件设计 3.1 系统上位机设计 设计目的 对于界面的设计,我们选择了labview制作一个简单的上位机软件,主要目的是接受来自串口的数据,然后显示出来。 设计思路 (1) 串口通信 我们选择VISA Configure Serial Port对串口进行资源配置,包括波特率、数据比特、奇偶位、流控制等,其中除了资源名称和波特率外,我们都选择默认参数。详细见下图 读取串口的是下图 写出串口的是下图 串口读取完毕我们关闭串口用到的是 其他我们还是用到的一些vi分别有 我们初步使用的是下图模型 但采样速度由于while循环占用资源过多,很是缓慢,所以我们修改后的结构如 把读取、写出综合一起的程序框图 (2) 前面板设计 四、作品展示 电机展示 驱动展示 整体展示 上位机展示 见上文。 五、设计总结 这一次的智控大赛,可以说是说是受益匪浅。 通过这一风力摆的随动控制系统的学习,有助于我们对于自动化的自动控制原理、现代控制原理等控制原理的知识的理解,对电力电子器件和PWM脉冲调频技术有了更深入的了解,在上位机labview也有所所获。调节PID的过程,搭建硬件的过程,写程序的过程,都是烦闷的,也正是队友之间彼此的鼓励和支持我们才能坚持下来,合作和团队的收获也是我们过程中最为珍贵。 六、附录 附录一 参考文献 【1】廖义奎嵌入式实战开发精解----基于STM32F1.北京清华大学出版社,2005. 【2】王屯令、苏亚辉5STM32开发指南LabVIEW卷.北京机械工业出版社,2013. 【3】华成英、童诗白模拟电子技术基础(第四版)高等教育出版社, 2007 【4】阎石数字电子技术基础高等教育出版社,2007.11 【5】赵星寒从0开始教你学STM32.北京航空航天大学出版社,2013. 附录二 代码 Main.c include sys.h include usart.h include delay.h include led.h include timer.h include mpu6050.h //include usmart.h include inv_mpu.h include inv_mpu_dmp_motion_driver.h include motor_diver.h include motor_pwm.h include motor_control.h include stdio.h /*------------------------------------------ 全局变量 ------------------------------------------*/ //extern uint8_t Q1_Start; //extern uint8_t Q2_Start; //extern uint8_t Q3_Start; //extern uint8_t Q4_Start; //extern uint8_t Q5_Start; //extern uint8_t Q6_Start; extern uint8_t ChooseMode; extern short PWM1; extern short PWM2; extern int pitchit,rollit; /*----------------------------------------- 初始化外设 ------------------------------------------*/ int mainvoid { u8 t0,report1;//默认开启上报 float pitch,roll; float yaw; //欧拉角 short aacx,aacy,aacz;//加速度传感器原始数据 short gyrox,gyroy,gyroz;//陀螺仪原始数据 // short pitcha0,rolla0,yawa0; //short temp;//温度 //NVIC_PriorityGroupConfigNVIC_PriorityGroup_2; delay_init; //延时函数初始化 uart_init115200; //串口初始化为9600 //usmart_dev.init72;//初始化USMART LED_Init; //初始化与LED连接的硬件接口 // GPIO_ResetBitsGPIOC,GPIO_Pin_13; MPU_Init;//初始化MPU6050 //PWM_Init; TIM4_PWM_Init99,36; // xdirver5000; // ydirver5000; while mpu_dmp_init{}; TIM2_Config5000-1,71; // xdirver99; // ydirver99; //delay_ms2000; // xdirver49; // ydirver49; //// xdirver98; //// ydirver98; // xdirver4999; // ydirver4999; // // TIM4_Config5000-1,72; /* TIM4 5ms Inturrupt 采样率200Hz 不能更改*/ // GPIO_SetBitsGPIOB,GPIO_Pin_1; while1{ //whilempu_dmp_get_datapitch,roll,yaw{}; // xdirver7000; // ydirver7000; //delay_ms600; //delay_ms600; //delay_ms600; // xdirver3000; // ydirver3000; //rollroll180.000; //yawyaw-161; //tempMPU_Get_Temperature;//得到温度值 //MPU_Get_Accelerometeraacx,aacy,aacz;//得到加速度传感器数据 //MPU_Get_Gyroscopegyrox,gyroy,gyroz;//得到陀螺仪数据 //ifreportmpu6050_send_dataaacx,aacy,aacz,gyrox,gyroy,gyroz;//用自定义帧发送加速度和陀螺仪原始数据 //ifreportusart1_report_imuaacx,aacy,aacz,gyrox,gyroy,gyroz,introll*100,intpitch*100,intyaw*10; //send_three_dataintroll*100,intpitch*100,intyaw*10; //发送三个角给labview上位机 // GPIO_SetBitsGPIOC,GPIO_Pin_13 ;//LED4 // delay_ms600; // GPIO_ResetBitsGPIOC,GPIO_Pin_13; //pitchapitch*10; //rollaroll*10; //yawayaw*10; //TIM_SetCompare1TIM2,499;//摆杆离地约20cm,摆高约92cm //TIM_SetCompare2TIM2,499; //TIM_SetCompare3TIM2,499; //TIM_SetCompare4TIM2,499; //TIM_SetCompare2TIM2,997; //TIM_SetCompare3TIM2,997; //delay_ms600;delay_ms600;delay_ms600;delay_ms600; //TIM_SetCompare2TIM2,4999; //TIM_SetCompare3TIM2,4999; } } MPU6050.c //初始化MPU6050 //返回值0,成功 // 其他,错误代码 u8 MPU_Initvoid { u8 res; MPU_IIC_Init;//初始化IIC总线 MPU_Write_ByteMPU_PWR_MGMT1_REG,0X80;//复位MPU6050 delay_ms100; MPU_Write_ByteMPU_PWR_MGMT1_REG,0X00;//唤醒MPU6050 MPU_Set_Gyro_Fsr3;//陀螺仪传感器,2000dps MPU_Set_Accel_Fsr0;//加速度传感器,2g MPU_Set_Rate50;//设置采样率50Hz MPU_Write_ByteMPU_INT_EN_REG,0X00;//关闭所有中断 MPU_Write_ByteMPU_USER_CTRL_REG,0X00;//I2C主模式关闭 MPU_Write_ByteMPU_FIFO_EN_REG,0X00;//关闭FIFO MPU_Write_ByteMPU_INTBP_CFG_REG,0X80;//INT引脚低电平有效 resMPU_Read_ByteMPU_DEVICE_ID_REG; ifresMPU_ADDR//器件ID正确 { MPU_Write_ByteMPU_PWR_MGMT1_REG,0X01;//设置CLKSEL,PLL X轴为参考 MPU_Write_ByteMPU_PWR_MGMT2_REG,0X00;//加速度与陀螺仪都工作 MPU_Set_Rate50;//设置采样率为50Hz }else return 1; return 0; } //设置MPU6050陀螺仪传感器满量程范围 //fsr0,250dps;1,500dps;2,1000dps;3,2000dps //返回值0,设置成功 // 其他,设置失败 u8 MPU_Set_Gyro_Fsru8 fsr { return MPU_Write_ByteMPU_GYRO_CFG_REG,fsr3;//设置陀螺仪满量程范围 } //设置MPU6050加速度传感器满量程范围 //fsr0,2g;1,4g;2,8g;3,16g //返回值0,设置成功 // 其他,设置失败 u8 MPU_Set_Accel_Fsru8 fsr { return MPU_Write_ByteMPU_ACCEL_CFG_REG,fsr3;//设置加速度传感器满量程范围 } //设置MPU6050的数字低通滤波器 //lpf数字低通滤波频率Hz //返回值0,设置成功 // 其他,设置失败 u8 MPU_Set_LPFu16 lpf { u8 data0; iflpf188data1; else iflpf98data2; else iflpf42data3; else iflpf20data4; else iflpf10data5; else data6; return MPU_Write_ByteMPU_CFG_REG,data;//设置数字低通滤波器 } //设置MPU6050的采样率假定Fs1KHz //rate41000Hz //返回值0,设置成功 // 其他,设置失败 u8 MPU_Set_Rateu16 rate { u8 data; ifrate1000rate1000; ifrate4rate4; data1000/rate-1; dataMPU_Write_ByteMPU_SAMPLE_RATE_REG,data;//设置数字低通滤波器 return MPU_Set_LPFrate/2;//自动设置LPF为采样率的一半 } //得到温度值 //返回值温度值扩大了100倍 short MPU_Get_Temperaturevoid { u8 buf[2]; short raw; float temp; MPU_Read_LenMPU_ADDR,MPU_TEMP_OUTH_REG,2,buf; rawu16buf[0]8|buf[1]; temp36.53doubleraw/340; return temp*100;; } //得到陀螺仪值原始值 //gx,gy,gz陀螺仪x,y,z轴的原始读数带符号 //返回值0,成功 // 其他,错误代码 u8 MPU_Get_Gyroscopeshort *gx,short *gy,short *gz { u8 buf[6],res; resMPU_Read_LenMPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf; ifres0 { *gxu16buf[0]8|buf[1]; *gyu16buf[2]8|buf[3]; *gzu16buf[4]8|buf[5]; } return res;; } //得到加速度值原始值 //gx,gy,gz陀螺仪x,y,z轴的原始读数带符号 //返回值0,成功 // 其他,错误代码 u8 MPU_Get_Accelerometershort *ax,short *ay,short *az { u8 buf[6],res; resMPU_Read_LenMPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf; ifres0 { *axu16buf[0]8|buf[1]; *ayu16buf[2]8|buf[3]; *azu16buf[4]8|buf[5]; } return res;; } //IIC连续写 //addr器件地址 //reg寄存器地址 //len写入长度 //buf数据区 //返回值0,正常 // 其他,错误代码 u8 MPU_Write_Lenu8 addr,u8 reg,u8 len,u8 *buf { u8 i; MPU_IIC_Start; MPU_IIC_Send_Byteaddr1|0;//发送器件地址写命令 ifMPU_IIC_Wait_Ack//等待应答 { MPU_IIC_Stop; return 1; } MPU_IIC_Send_Bytereg;//写寄存器地址 MPU_IIC_Wait_Ack;//等待应答 fori0;ilen;i { MPU_IIC_Send_Bytebuf[i];//发送数据 ifMPU_IIC_Wait_Ack//等待ACK { MPU_IIC_Stop; return 1; } } MPU_IIC_Stop; return 0; } //IIC连续读 //addr器件地址 //reg要读取的寄存器地址 //len要读取的长度 //buf读取到的数据存储区 //返回值0,正常 // 其他,错误代码 u8 MPU_Read_Lenu8 addr,u8 reg,u8 len,u8 *buf { MPU_IIC_Start; MPU_IIC_Send_Byteaddr1|0;//发送器件地址写命令 ifMPU_IIC_Wait_Ack//等待应答 { MPU_IIC_Stop; return 1; } MPU_IIC_Send_Bytereg;//写寄存器地址 MPU_IIC_Wait_Ack;//等待应答 MPU_IIC_Start; MPU_IIC_Send_Byteaddr1|1;//发送器件地址读命令 MPU_IIC_Wait_Ack;//等待应答 whilelen { iflen1*bufMPU_IIC_Read_Byte0;//读数据,发送nACK else *bufMPU_IIC_Read_Byte1;//读数据,发送ACK len--; buf; } MPU_IIC_Stop;//产生一个停止条件 return 0; } //IIC写一个字节 //reg寄存器地址 //data数据 //返回值0,正常 // 其他,错误代码 u8 MPU_Write_Byteu8 reg,u8 data { MPU_IIC_Start; MPU_IIC_Send_ByteMPU_ADDR1|0;//发送器件地址写命令 ifMPU_IIC_Wait_Ack//等待应答 { MPU_IIC_Stop; return 1; } MPU_IIC_Send_Bytereg;//写寄存器地址 MPU_IIC_Wait_Ack;//等待应答 MPU_IIC_Send_Bytedata;//发送数据 ifMPU_IIC_Wait_Ack//等待ACK { MPU_IIC_Stop; return 1; } MPU_IIC_Stop; return 0; } //IIC读一个字节 //reg寄存器地址 //返回值读到的数据 u8 MPU_Read_Byteu8 reg { u8 res; MPU_IIC_Start; MPU_IIC_Send_ByteMPU_ADDR1|0;//发送器件地址写命令 MPU_IIC_Wait_Ack;//等待应答 MPU_IIC_Send_Bytereg;//写寄存器地址 MPU_IIC_Wait_Ack;//等待应答 MPU_IIC_Start; MPU_IIC_Send_ByteMPU_ADDR1|1;//发送器件地址读命令 MPU_IIC_Wait_Ack;//等待应答 resMPU_IIC_Read_Byte0;//读取数据,发送nACK MPU_IIC_Stop;//产生一个停止条件 return res; } MPUIIC.c //MPU IIC 延时函数 void MPU_IIC_Delayvoid { delay_us2; } //初始化IIC void MPU_IIC_Initvoid { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockRCC_APB2Periph_GPIOB,ENABLE;//先使能外设IO PORTC时钟 GPIO_InitStructure.GPIO_Pin GPIO_Pin_10|GPIO_Pin_11; // 端口配置 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_InitGPIOB, GPIO_InitStructure; //根据设定参数初始化GPIO GPIO_SetBitsGPIOB,GPIO_Pin_10|GPIO_Pin_11; //PB13,PB14 输出高 } //产生IIC起始信号 void MPU_IIC_Startvoid { MPU_SDA_OUT; //sda线输出 MPU_IIC_SDA1; MPU_IIC_SCL1; MPU_IIC_Delay; MPU_IIC_SDA0;//STARTwhen CLK is high,DATA change high to low MPU_IIC_Delay; MPU_IIC_SCL0;//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void MPU_IIC_Stopvoid { MPU_SDA_OUT;//sda线输出 MPU_IIC_SCL0; MPU_IIC_SDA0;//STOPwhen CLK is high DATA change low to high MPU_IIC_Delay; MPU_IIC_SCL1; MPU_IIC_SDA1;//发送I2C总线结束信号 MPU_IIC_Delay; } //等待应答信号到来 //返回值1,接收应答失败 // 0,接收应答成功 u8 MPU_IIC_Wait_Ackvoid { u8 ucErrTime0; MPU_SDA_IN; //SDA设置为输入 MPU_IIC_SDA1;MPU_IIC_Delay; MPU_IIC_SCL1;MPU_IIC_Delay; whileMPU_READ_SDA { ucErrTime; ifucErrTime250 { MPU_IIC_Stop; return 1; } } MPU_IIC_SCL0;//时钟输出0 return 0; } //产生ACK应答 void MPU_IIC_Ackvoid { MPU_IIC_SCL0; MPU_SDA_OUT; MPU_IIC_SDA0; MPU_IIC_Delay; MPU_IIC_SCL1; MPU_IIC_Delay; MPU_IIC_SCL0; } //不产生ACK应答 void MPU_IIC_NAckvoid { MPU_IIC_SCL0; MPU_SDA_OUT; MPU_IIC_SDA1; MPU_IIC_Delay; MPU_IIC_SCL1; MPU_IIC_Delay; MPU_IIC_SCL0; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void MPU_IIC_Send_Byteu8 txd { u8 t; MPU_SDA_OUT; MPU_IIC_SCL0;//拉低时钟开始数据传输 fort0;t8;t { MPU_IIC_SDAtxd0 x807; txd1; MPU_IIC_SCL1; MPU_IIC_Delay; MPU_IIC_SCL0; MPU_IIC_Delay; } } //读1个字节,ack1时,发送ACK,ack0,发送nACK u8 MPU_IIC_Read_Byteunsigned char ack { unsigned char i,receive0; MPU_SDA_IN;//SDA设置为输入 fori0;i8;i { MPU_IIC_SCL0; MPU_IIC_Delay; MPU_IIC_SCL1; receive1; ifMPU_READ_SDAreceive; MPU_IIC_Delay; } if ack MPU_IIC_NAck;//发送nACK else MPU_IIC_Ack; //发送ACK return receive; } Timer.c include motor_control.h include motor_pid.h include motor_pwm.h include Timer.h include stm32f10 x.h include stdio.h include stdlib.h include delay.h //include usart1.h //include indkey.h include ahrs.h include mpu6050.h includ

    注意事项

    本文(基于stm32的风力摆控制系统设计.docx)为本站会员(admin)主动上传,工友文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知工友文库(发送邮件至gydoc@qq.com或直接QQ联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    copyright@ 2019-2022 工友文库网站版权所有
    经营许可证编号:鲁ICP备19032292号-1


    1
    收起
    展开