一、实操考题

主题:码盘控制直流电机转动

器件:ESP32主控、码盘、光电对管、SSD1306 OLED显示屏、电位器模块、直流电机驱动模块、直流电机。

要求

1、将码盘和直流电机有效固定。通过电位器控制直流电机的启停和转速,当装置通电后,电机处于停止状态。

2、旋转电位器,电机开始转动。

3、通过码盘和光电对管模块,采用中断并累加计数,读取电机的转动数据。

4、将电机的转动数据和转动的圈数实时显示在SSD1306 OLED显示屏上。

5、将电机的转动数据和转动的圈数实时显示到串口监视器。

6、控制程序采用C代码编写。

7、为了便于展示,整个装置需要有效固定。

8、SSD1306 OLED显示屏可使用教材对应的库,其它程序编写均不得使用外部库调用。

9、未作规定可自行处理,无明显与事实违背即可。

10、编写程序文件命名规则为:DJKS6_身份证号,考试完毕拷贝上交备案。

11、程序编写过程中不得打开库例程和其它程序,如发现,实操成绩按照0分处理。

 

说明:Ssd1306Console类库头文件和相关类库函数如下,供参考。

头文件: ssd1306.h   ssd1306_console.h

类库对象: Ssd1306Console  

部分成员函数:

ssd1306_128x64_i2c_init();    //初始化SSD1306显示屏

ssd1306_clearScreen();   //清除屏幕

ssd1306_setFixedFont(ssd1306xled_font6x8);  //设置显示的文字字体类型

Ssd1306Console.println() //输出内容到SSD1306显示屏

二、评分组成

实操题总分100分,由两部分组成,分别为:电路搭设功能呈现。其中电路搭设分值20分,功能呈现80分。

三、电路搭设评分 -- 总分20分

原器件:

1、装置中包含直流电机、码盘及直流电机驱动模块,得3分。

2、装置中包含SSD1306 OLED显示屏,得3分。

3、装置中包含光电对管模块,得3分。

4、装置中包含电位器模块,得3分。

电路搭设:

5、整个装置有效固定,得4分。

6、各模块均正确连接,得4分。

四、功能呈现评分 -- 总分80分

1、当装置通电后,电机处于停止状态,得5分。

2、旋转电位器,电机开始转动,得15分。

3、将电机的转动数据和转动的圈数实时显示在SSD1306 OLED显示屏上,得20分。

4、将电机的转动数据和转动的圈数实时显示到串口监视器,得10分。

5、根据电机的旋转,判断显示的圈数数据是否正确,如正确,得15分。

6、旋转电位器,调整电机的转速,串口监视器显示的数据随之而改变,得15分。

代码如下:

//主题:码盘控制直流电机转动

//器件:ESP32主控、码盘、光电对管、SSD1306 OLED显示屏、电位器模块、直流电机驱动模块、直流电机。

//要求:

//1、将码盘和直流电机有效固定。通过电位器控制直流电机的启停和转速,当装置通电后,电机处于停止状态。

//2、旋转电位器,电机开始转动。

//3、通过码盘和光电对管模块,采用中断并累加计数,读取电机的转动数据。

//4、将电机的转动数据和转动的圈数实时显示在SSD1306 OLED显示屏上。

//5、将电机的转动数据和转动的圈数实时显示到串口监视器。

 

#include <ssd1306.h>

#include <ssd1306_console.h>

Ssd1306Console console;             //创建类库对象

const int potPin = 25;              //电位器管脚

const int encodePin = 35;           //码盘光电对应到管脚

const int resoWheel = 112;          //码盘条纹数

unsigned int count = 0;             //中断计数使用的

const int mPin1 = 12;               //电机控制的管脚

const int mPin2 = 13;               //电机控制的管脚

 

void setup()

{

  Serial.begin(115200);

  ssd1306_128x64_i2c_init();

  ssd1306_setFixedFont(ssd1306xled_font6x8);

  ssd1306_clearScreen();

  console.println("This is a test");           //简单测试一下屏幕是否正常显示 

  pinMode(encodePin, INPUT);

 

  digitalWrite(mPin1, LOW);

  digitalWrite(mPin2, LOW);

 

  analogSetWidth(10);                          //ADC的分辨率为10位。

  ledcSetup(0, 5000, 10);                      //频率5000HZ,10位分辨率,0通道

  ledcSetup(1, 5000, 10);                      //频率5000HZ,10位分辨率,1通道

  ledcAttachPin(12, 0);                        //0通道关联12管脚

  ledcAttachPin(13, 1);                        //1通道关联13管脚

  attachInterrupt(encodePin, func, RISING);    //中断管脚,初始化,fuc为中断回调函数名,上升沿触发中断。

}

 

void loop()

{

  int speed = analogRead(potPin);               //获取电位器值

  ledcWrite(0, 0);

  ledcWrite(1, speed);                          //向通道1写入获取到到电位器值

  int num = count/resoWheel;                    //获取转动到圈数  除以112   线

  Serial.printf("%d--%d\n",count,num);          //串口打印中断次数和圈数

  console.printf("%d--%d\n",count,num);         //OLED屏刷新数据,显示中断次数和圈数

}

 

void func()                                     //中断回调函数

{

  count++;

}