下面给大家介绍一个Arduino单片机的Proteus仿真项目实例:
工具/原料
电脑
Arduino
Proteus仿真软件
方法/步骤
1、这个仿真项目实例的任务是:分别按下K1(正转)按钮、K2(反转)按钮和K3(停止)按钮,直流电机会分别产生相应的动作,而且当调节电位计时,电机的转速也随之发生变化。
2、电气符号用到了芯片元件、电源终端、虚拟仪器和连线标号,它们分别从各自的模式库中提取出来。
3、仿真图中,电源终端用到了VCC电源与接地符号,虚拟仪器用到了四通道示波器和直流电压表,连线标号的作用是相同连线标号的两根线在电气意义上是相连的,如图8中的标号A、B和PWM。至于芯片元件,仿真图里用到了电阻、电容、CPU、晶振、直流电机、稳压管、L298N驱动等等,芯片元件的提取通常有两种方法,父、子类别检索方法和关键字查询法。 父、子类别检索方法是:先选择元件模式库,再点击“P”按钮,打开元件查询提取对话框,如图10所示,例如提取的元件是单片机芯片ATMEGA328P,先在类别里找到Microprocessor ICs,在子类别里找到AVR Family,再在制造商里找到Atmel,然后在缩小了寻找范围的结果中找到这个单片机芯片ATMEGA328P,找到后双击芯片,就可以把芯片提取到ISIS界面左侧的DEVICES栏中,供原理图绘制时随时选用
4、关键字查询法是:如果事先知道要提取的元件名称,可以在元件查询提取对话框左上方的关键字输入栏里输入元件名称,如搜寻motor元件,直接输入motor,回车后,在结果中可以很容易地找到所需元件。
5、把硬件线路绘制完成,剩下的事就是编写程序,编译仿真了,瘫蝠熨夯我设计的这个仿真项目正好把数字量和模拟量输入输音浆纪娟出都涉及到了,按钮输入和驱动芯片L298N的电机转向控制端A、B是数字量输入输出,电位计输入和L298N的转速调节控制端PWM是模拟量输入输出。数字量输入输出的Arduino命令分别是digitalRead(数字端口号)和digitalWrite(数字端口号,LOW或HIGH);模拟量输入输出的Arduino命令是analogRead(模拟端口号)和analogWrite(数字端口号, 0~255)。模拟端口只有输入模式,没有输出模式,Arduino模拟量输出是以PWM信号形式从具有PWM输出功能的数字端口输出的。Arduino微控制器的数字端口和模拟端口与ATMEGA 328芯片引脚的对应关系图如下。标有0~13标号的引脚对应的是数字端口,在0~13前面有符号“~”的引脚对应的端口具有PWM输出功能。标有A0~A5标号的是模拟端口。
6、ArduinoUNO端口与Atme壹执慵驾ga328P引脚对应图有了Arduino UNO端口与Atmega328P徂葛幢捎引脚对应图,就可以方便地利用Proteus硬件仿真图,有针对性地编写Arduino程序了。由于以下程序中有详细的注释,所以对每行Arduino程序的作用就不再累述了。Arduino程序://任务:通过按钮控制电机启停和正反转,通过电位计调节电机转速。int K1=5;//把K1(正转)按钮连在数字端口5int K2=6;//把K2(反转)按钮连在数字端口6int K3=7;//把K3(停止)按钮连在数字端口7int potpin=3;//把电位计连在模拟端口3int A=2;//数字端口3控制电机启停和转向int B=3;int PWMpin=9;//数字端口9输出PWM信号,控制电机转速//初始化void setup(){ pinMode(K1,INPUT);//把数字端口7设置输入模式 pinMode(K2,INPUT); pinMode(K2,INPUT); pinMode(A,OUTPUT);//把数字端口3设置输入模式 pinMode(B,OUTPUT);}//主程序void loop(){ //如果按下K1(正转)按钮if(digitalRead(K1)==LOW){ //电机正转 digitalWrite(A,HIGH); digitalWrite(B,LOW);}//如果按下K2(反转)按钮if(digitalRead(K2)==LOW){ //电机反转 digitalWrite(A,LOW); digitalWrite(B,HIGH);}//如果按下K3(停止)按钮if(digitalRead(K3)==LOW){ //电机停止 digitalWrite(A,LOW); digitalWrite(B,LOW);}int sensorValue=analogRead(potpin);//读取电位计采样值sensorValue =sensorValue/4;//采样值0-1024转换为0-255analogWrite(PWMpin, sensorValue);//把处理后的转换值以PWM信号形式输出delay(20);//延时}