当前位置: 首页 > news >正文

基于PID的直流电机调速控制系统

目 录
第一部分 毕业设计概述 4
1.1 毕业设计的目的与任务 4
1.2 毕业设计题目 4
1.3 设计功能要求 4
1.4 毕业设计的内容与要求 4
1.5 实验仪器设备及器件 4
第二部分 设计方案工作原理 5
2.1 预期实现目标定位 5
2.2 技术方案分析 5
2.2.1系统框图 5
2.2.2电路工作原理 5
2.2.3控制算法原理 6
2.3 功能指标实现方法 7
2.3.1 实现方案分析 7
2.3.2 基本模块原理 7
第三部分 核心部件电路设计 9
3.1 关键器件性能分析 9
3.2 电路工作原理 9
3.3 电路驱动接口说明 9
第四部分 系统软件设计分析 10
4.1 系统总体工作流程 10
4.2 程序设计思路 10
4.3 关键模块程序清单 11
4.3.1编码器测速 11
4.3.2五向按键检测 11
4.3.3 OLED显示 12
4.3.4 PID控制 13
4.4 调试分析 14
4.4.1 总体说明 14
4.4.2 PID算法调节分析 14
第五部分 心得体会 16
第六部分 附录 17
Ⅰ参考文献 17
Ⅱ电路原理图 17
Ⅲ源代码 18
第一部分 毕业设计概述
1.1 毕业设计的目的与任务
《单片机应用系统设计》毕业设计是运用“应用系统设计”这门毕业所学的应用系统设计的各方面知识,进行综合设计的一门毕业。设计者要熟练掌握 Keil C 软件编程环境和 STC 单片机的片上资源,并通过查文献资料了解掌握相关外围器件的用法,综合运用进行设计。本毕业是配合单片机原理和应用系统设计及模拟、数字电路,传感器原理等多门毕业教学的一个重要实践环节,本文转载自http://www.biyezuopin.vip/onews.asp?id=15131能帮助学生应用课堂学习到的知识,加强综合能力,提高系统设计水平。
1.2 毕业设计题目
直流电机控制系统
1.3 设计功能要求
(1)焊接电机控制电路板,调试后电路功能正常; (30 分)
(2)可以通过 5 向按键左右控制电机正反转、侧向按键控制电机启动/停止;(10 分)
(3)通过旋纽电阻控制电机转速或角度(可二选一);(20 分)
(4)相关电机转速或角度,转动方向信息在 LCD1602 或 OLED 上显示; (20 分)
(5)通过 PID 调节,通过旋纽控制转速或转动角度(可二选一),数据通过串口,在电脑上显示曲线(可借助匿名地面站工具),相应的在显示器上显示目标转速或角度。(15 分)
(6)其他。(5 分)
1.4 毕业设计的内容与要求
(1)设计制作硬件电路;
(2)编写单片机系统软件;
(3)软硬件调试;
(4)写毕业设计报告
1.5 实验仪器设备及器件
1)PC机;
2)Keil C51软件;
3)STC15F2K60S2增强型单片机,TB6612电机驱动芯片,直流电机,OLED显示屏;

//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//中景园电子

//******************************************************************************/。
#include "oled.h"
#include <myself.h>
#include "oledfont.h"  
#include "bmp.h"
#include "intrins.h"
#define nop _nop_();
//#include "delay.h"
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127	
//[1]0 1 2 3 ... 127	
//[2]0 1 2 3 ... 127	
//[3]0 1 2 3 ... 127	
//[4]0 1 2 3 ... 127	
//[5]0 1 2 3 ... 127	
//[6]0 1 2 3 ... 127	
//[7]0 1 2 3 ... 127 		


/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{

	OLED_SCLK_Set() ;
	OLED_SDIN_Set();
	OLED_SDIN_Clr();
	OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
	OLED_SCLK_Set() ;
//	OLED_SCLK_Clr();
	OLED_SDIN_Clr();
	OLED_SDIN_Set();
	
}

void  IIC_Wait_Ack()
{
	//GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为上拉输入模式
	//GPIOB->CRH |= 0x00080000;
//	OLED_SDA = 1;
//	delay_us(1);
	//OLED_SCL = 1;
	//delay_us(50000);
/*	while(1)
	{
		if(!OLED_SDA)				//判断是否接收到OLED 应答信号
		{
			//GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为通用推免输出模式
			//GPIOB->CRH |= 0x00030000;
			return;
		}
	}
*/
	OLED_SCLK_Set() ;
	OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	unsigned char m,da;
	da=IIC_Byte;
	OLED_SCLK_Clr();
	for(i=0;i<8;i++)		
	{
			m=da;
		//	OLED_SCLK_Clr();
		m=m&0x80;
		if(m==0x80)
		{OLED_SDIN_Set();}
		else OLED_SDIN_Clr();
			da=da<<1;
		OLED_SCLK_Set();
		OLED_SCLK_Clr();
		}


}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);            //Slave address,SA0=0
	IIC_Wait_Ack();	
   Write_IIC_Byte(0x00);			//write command
	IIC_Wait_Ack();	
   Write_IIC_Byte(IIC_Command); 
	IIC_Wait_Ack();	
   IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
	IIC_Wait_Ack();	
   Write_IIC_Byte(0x40);			//write data
	IIC_Wait_Ack();	
   Write_IIC_Byte(IIC_Data);
	IIC_Wait_Ack();	
   IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
	if(cmd)
			{

   Write_IIC_Data(dat);
   
		}
	else {
   Write_IIC_Command(dat);
		
	}


}

/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		OLED_WR_Byte(0xb0+m,0);		//page0-page1
		OLED_WR_Byte(0x00,0);		//low column start address
		OLED_WR_Byte(0x10,0);		//high column start address
		for(n=0;n<128;n++)
			{
				OLED_WR_Byte(fill_Data,1);
			}
	}
}


///***********************Delay****************************************/
//void Delay_50ms(unsigned int Del_50ms)
//{
//	unsigned int m;
//	for(;Del_50ms>0;Del_50ms--)
//		for(m=6245;m>0;m--);
//}

//void Delay_1ms(unsigned int Del_1ms)
//{
//	unsigned char j;
//	while(Del_1ms--)
//	{	
//		for(j=0;j<123;j++);
//	}
//}

//坐标设置

	void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f),OLED_CMD); 
}   	  
//开启OLED显示    
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//关闭OLED显示     
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}		   			 
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  
	unsigned char i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA); 
	} //更新显示
}
void OLED_On(void)  
{  
	unsigned char i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); 
	} //更新显示
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
{      	
	unsigned char c=0,i=0;	
		c=chr-' ';//得到偏移后的值			
		if(x>Max_Column-1){x=0;y=y+2;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(i=0;i<6;i++)
				OLED_WR_Byte(F6x8[c][i],OLED_DATA);
				
			}
}
//m^n函数
unsigned int oled_pow(unsigned char m,unsigned char n)
{
	unsigned int result=1;	 
	while(n--)result*=m;    
	return result;
}				  
//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);	 		  
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size2)
{         	
	unsigned char t,temp;
	unsigned char enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
	}
} 
//显示一个字符号串
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}
//显示汉字
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
{      			    
	unsigned char t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{ 	
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
	    {      
	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	    	
	    }
	}
} 

//初始化SSD1306					    
void OLED_Init(void)
{ 	
 
  OLED_WR_Byte(0xAE,OLED_CMD);//--display off
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
	OLED_WR_Byte(0x81,OLED_CMD); // contract control
	OLED_WR_Byte(0xFF,OLED_CMD);//--128   
	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
	OLED_WR_Byte(0x00,OLED_CMD);//
	
	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
	OLED_WR_Byte(0x80,OLED_CMD);//
	
	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
	OLED_WR_Byte(0x05,OLED_CMD);//
	
	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);//
	
	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);//
	
	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
	OLED_WR_Byte(0x30,OLED_CMD);//
	
	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
	OLED_WR_Byte(0x14,OLED_CMD);//
	
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • SSM+基于SSM的课堂考勤管理系统的设计与实现 毕业设计-附源码191617
  • SWUST OJ#99 欧几里得博弈
  • 基于Springboot+mysql的闲置二手交易网站系统设计
  • Code For Better 谷歌开发者之声 ——Tensorflow与深度学习
  • Web阶段一 静态网页
  • 第五章:数组、排序和查找
  • 香橙派 C# IOT .net 引用WiringOP操作引脚高电平低电平 代码实例
  • 高等数学(第七版)同济大学 习题7-7 个人解答
  • Python每日一练(牛客数据分析篇新题库)——第33天:中位函数
  • 10. 元组、集合
  • 清理MySQL中的binlog
  • 计算机毕业设计ssm高校学科竞赛管理系统eolh8系统+程序+源码+lw+远程部署
  • MySQL索引相关知识整理学习
  • Linux——Linux指令2|more指令|less指令|head和tail指令|管道|时间相关的指令|date显示|Cal指令|find指令
  • rollback-only异常令我对事务有了新的认识
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Angular 2 DI - IoC DI - 1
  • Apache Spark Streaming 使用实例
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  •  D - 粉碎叛乱F - 其他起义
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JDK 6和JDK 7中的substring()方法
  • mysql_config not found
  • MySQL几个简单SQL的优化
  • Vultr 教程目录
  • 闭包--闭包作用之保存(一)
  • 从输入URL到页面加载发生了什么
  • 基于 Babel 的 npm 包最小化设置
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊flink的BlobWriter
  • 盘点那些不知名却常用的 Git 操作
  • 前端js -- this指向总结。
  • 前言-如何学习区块链
  • 使用agvtool更改app version/build
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​香农与信息论三大定律
  • #include到底该写在哪
  • (02)vite环境变量配置
  • (4)Elastix图像配准:3D图像
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net 无限分类
  • .net(C#)中String.Format如何使用
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @Autowired多个相同类型bean装配问题
  • @RequestMapping-占位符映射