目 录
摘 要 1
关键词 1
1 前言 1
2 建立播种量、速度与转速的数学模型 2
3 智能播种机控制系统整体方案 4
3.1 智能播种机控制系统的整体思路 4
3.2 智能播种控制系统方框图 4
3.3 单片机的选择与概述 5
3.3.1 单片机的选择 5
3.3.2 ATmega128单片机结构与性能特点 5
4 智能播种机控制系统模块概述及原理 7
4.1 单片机系统模块 7
4.1.1 单片机电源模块 7
4.1.2 ATmega128单片机最小系统模块 8
4.2 JTAG通讯模块 9
4.3 播量信息输入模块 10
4.3.1 键盘输入播量 10
4.3.2 智能播量的控制 10
4.4 机具前进速度采样模块 10
4.4.1 传感器的选择 10
4.4.2 增量式旋转编码盘原理 11
4.4.3 机具前进速度采集电路 11
4.4.4 光电编码盘测速方法 12
4.5 检测播种量模块 13
4.5.1 传感器的分析及选择 13
4.5.2 光纤传感器的结构原理 14
4.5.3 传感器的电路原理图 14
4.5.4 传感器的安装 15
4.5.5 油菜籽粒检测方法 16
4.5.6 模糊算法 16
4.5.7 籽粒数转化成播量的算法 17
4.6 液晶显示模块 17
5 执行机构的确定 18
5.1执行机构类型 18
5.1.1可用执行机构 18
5.1.2 执行机构的选取 18
5.2 伺服系统介绍 19
5.2.1 伺服电机工作原理 19
5.2.2伺服器 20
6 整体系统原理图 21
7 智能播种机控制系统程序设计 21
7.1 程序设计的目标 21
7.2 系统软件开发工具 21
7.2.1 C语言 21
7.2.2 程序编程工具IAREW 22
7.3 程序开发流程介绍 22
7.3.1 系统主程序流程 22
7.3.2 系统的子程序流程 23
7.3.3 检测机具前进速度子程序 23
7.3.4 播量检测子程序 23
7.3.5 电机转速控制子程序 23
7.3.5 LCD1602子程序 23
7.4 小结 23
8 总结 24
参考文献 24
致 谢 25
附录 25
6 整体系统原理图
通过以上对系统的整体分析以及各个部分的硬件设计,总结出系统的整个硬件电路原理图,根据硬件电路原理图对电路板进行印刷,并进行相关元器件的连接,最终得到控制系统的控制板。原理图见附录。
7 智能播种机控制系统程序设计
7.1 程序设计的目标
所设计的控制系统要实现以下功能:
(1)ATmega128单片机各端口和定时/计数器的初始化;
(2)1602LCD液晶显示屏初始化和相关参数的输入;
(3)ATmega128单片机根据增量编码传感器采集到的脉冲计算出机具前进速度;
(4)ATmega128单片机根据播量计算公式以及输入的播量值、采集的机具前进速度值计算出电机的转速;
(5)ATmega128单片机根据计算出的电机转速以PWM形式调速伺服系统;
(6)光纤传感器能够检测排出油菜的籽粒数,并计算出相应的播量,与输入的播量相比较,并重新调整电机转速。
7.2 系统软件开发工具
ATmega128单片机进行编程,要选择编程软件和程序语言。
7.2.1 C语言
目前支持单片机应用系统开发的语言一般有汇编语言和高级语言。由于汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,编写的代码非常难懂、不好维护、开发效率很低、时间长且单调,本文转载自http://www.biyezuopin.vip/onews.asp?id=14409不适合本设计的程序开发。C语言是一种面向过程的计算机程序设计语言,易懂易学、简洁紧凑、灵活方便、运算符丰富、数据类型丰富,因此采用C语言作为程序设计语言。
7.2.2 程序编程工具IAREW
嵌入式IAREW是一个非常有效的程序开发工具,适用于大量8位、16位以及32位的处理器和微控制器,因此在对项目进行开发时能在所熟悉的环境中进行;它包含有高度优化的IARAVRC/C++编译器、AVRIAR汇编器、工程管理器、高级语言调试器等可用工具,提供了一个成功工程所需的所有工具,因此使用时非常简单、方便;另外它可以输出多种格式,用户在其它软件上进行调试和下载都非常方便;嵌入式IAREW不但代码编译效率比GCC和ICC高很多,而且下载仿真都十分方便,因此得到相关研究者的广泛应用。
#include<iom128.h>/*******************头文件定义****************/#include<intrinsics.h>#include<comp_a90.h>#include<math.h>#include"LCD1602.H"#include"key.h"/*******************宏定义********************/#defineSPACE10//采样10次/*****************全局变量定义****************/unsignedcharPeriod_Base=0,Count=0,Pulse_Count=0,flag=0x00;unsignedlongSum_Pulse=0,Sum_Time=0;unsignedlongPeriod_Value[3]={0,0,0};unsignedlongPulse_Period_Value[SPACE]={0};unsignedintNumber=0;unsignedlongAverage_Value=0;/*****************函数定义********************/voidport_init(void)//I/O口配置函数{PORTA=0x00;DDRA=0x00;PORTB=0x00;DDRB=0x30;PORTC=0x00;DDRC=0x00;PORTD=0x00;DDRD=0x00;}voidtimer0_init(void){TCCR0=0x00;//stopASSR=0x00;//set async modeTCNT0=0xD7;//set countOCR0=0x7d;//值0x7d为1KHZ; 值0x29为3KHZTCCR0=0x00;//0x1A start timer; 0x00 stop timer}voidtimer1_init(void)//定时器1输入捕获中断配置函数{TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;OCR1AH=0x03;OCR1AL=0xE8;OCR1BH=0x03;OCR1BL=0xE8;ICR1H=0x03;ICR1L=0xE8;TCCR1A=0x00;//TCCR1B = 0xC0;//初始化为上升沿}voidinit_devices(void)//系统初始化函数,系统时钟为2Mhz{_CLI();port_init();timer0_init();timer1_init();LCD1602_Initial();key_initail();MCUCR=0x00;TIMSK=0x24;_SEI();}voidmain(void)//主函数{externfloatV_Value;//机具前进速度externfloatH_Value;//实际输出播量unsignedchari=0,j=0;unsignedlongtemp=0;init_devices();//初始化系统write_string(0,0," *Rapeseed-Sys* ");write_string(0,1," Initializing.. ");delay_nms(200);write_string(0,0,"V:----m/sQ:----g");write_string(0,1,"n:----r/mH:----g");while(1)//等待{key_scanf();if((flag&0x01)==0x01)//油菜籽采样数据处理算法{_CLI();//禁用中断flag=0x00;Pulse_Count=0;for(j=0;j<SPACE-1;j++)//冒泡排序{for(i=0;i<SPACE-1-j;i++){if(Pulse_Period_Value[i]>Pulse_Period_Value[i+1]){temp=Pulse_Period_Value[i];Pulse_Period_Value[i]=Pulse_Period_Value[i+1];Pulse_Period_Value[i+1]=temp;}}}for(j=1;j<SPACE-1;j++)//去掉最大值和最小值{temp+=Pulse_Period_Value[j];}temp/=(SPACE-2);//求平均值for(j=0;j<SPACE;j++)//计算油菜籽总个数{if(temp>Pulse_Period_Value[j]){Number++;}elseif(temp<=Pulse_Period_Value[j]&&2*temp/3>Pulse_Period_Value[j]){Number++;}elseif(2*temp/3<=Pulse_Period_Value[j]&&5*temp/2>Pulse_Period_Value[j]){Number+=2;}elseif(5*temp/2<=Pulse_Period_Value[j]&&7*temp/2>Pulse_Period_Value[j]){Number+=3;}}Average_Value=Number*2000000/Sum_Time;//计算实际油菜籽每秒的实际输出量Number=0;//总粒清零Sum_Time=0;//总时间清零TIMSK=0x24;_SEI();//打开中断H_Value=12*Average_Value/V_Value;//实际采样数据Separate_IntData((unsignedint)H_Value,0xCB,4);//显示实际采样数据}}}