Arduino单片机的Proteus仿真项目实例
下面给大家介绍一个Arduino单片机的Proteus仿真项目实例:
操作方法
- 01
这个仿真项目实例的任务是:分别按下K1(正转)按钮、K2(反转)按钮和K3(停止)按钮,直流电机会分别产生相应的动作,而且当调节电位计时,电机的转速也随之发生变化。
- 02
电气符号用到了芯片元件、电源终端、虚拟仪器和连线标号,它们分别从各自的模式库中提取出来。
- 03
仿真图中,电源终端用到了VCC电源与接地符号,虚拟仪器用到了四通道示波器和直流电压表,连线标号的作用是相同连线标号的两根线在电气意义上是相连的,如图8中的标号A、B和PWM。至于芯片元件,仿真图里用到了电阻、电容、CPU、晶振、直流电机、稳压管、L298N驱动等等,芯片元件的提取通常有两种方法,父、子类别检索方法和关键字查询法。 父、子类别检索方法是:先选择元件模式库,再点击“P”按钮,打开元件查询提取对话框,如图10所示,例如提取的元件是单片机芯片ATMEGA328P,先在类别里找到Microprocessor ICs,在子类别里找到AVR Family,再在制造商里找到Atmel,然后在缩小了寻找范围的结果中找到这个单片机芯片ATMEGA328P,找到后双击芯片,就可以把芯片提取到ISIS界面左侧的DEVICES栏中,供原理图绘制时随时选用
- 04
关键字查询法是:如果事先知道要提取的元件名称,可以在元件查询提取对话框左上方的关键字输入栏里输入元件名称,如搜寻motor元件,直接输入motor,回车后,在结果中可以很容易地找到所需元件。
- 05
把硬件线路绘制完成,剩下的事就是编写程序,编译仿真了,我设计的这个仿真项目正好把数字量和模拟量输入输出都涉及到了,按钮输入和驱动芯片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标号的是模拟端口。
- 06
Arduino UNO端口与Atmega328P引脚对应图有了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; //数字端口2、3控制电机启停和转向int B=3; int PWMpin = 9; // 数字端口9输出PWM信号,控制电机转速//初始化void setup() { pinMode(K1,INPUT);//把数字端口5、6、7设置输入模式 pinMode(K2,INPUT); pinMode(K2,INPUT); pinMode(A,OUTPUT);//把数字端口2、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-255 analogWrite(PWMpin, sensorValue);//把处理后的转换值以PWM信号形式输出 delay(20);//延时}