Skip to content

Commit 8875be8

Browse files
committed
feat: version 4.5 basic pid + EncoderMotor control test1 finished
1 parent febf33d commit 8875be8

18 files changed

+838
-249
lines changed

Basic_Development/New_Car_Control/Encoder_Base/CMakeLists.txt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.0)
1+
cmake_minimum_required(VERSION 4.5)
22
project(tt)
33

44
set(CMAKE_CXX_STANDARD 11)
@@ -18,7 +18,15 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
1818
include_directories(${CMAKE_SOURCE_DIR})
1919

2020
# Specify source files
21-
add_executable(tt ServoTest.cpp Emakefun_MotorDriver.cpp Emakefun_MotorShield.cpp Raspi_i2c.cpp)
21+
# tag-> for change
22+
# Emakefun_MotorShield.cpp
23+
add_executable(tt
24+
EncoderMotTest.cpp
25+
PID.cpp
26+
encoder.cpp
27+
EncoderShield.cpp
28+
Emakefun_MotorDriver.cpp
29+
Raspi_i2c.cpp)
2230

2331
# Output target files to the bin directory
2432
set_target_properties(tt PROPERTIES
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include "Emakefun_MotorShield.h"
2+
3+
int main() {
4+
Emakefun_MotorShield Pwm = Emakefun_MotorShield();
5+
Pwm.begin(50);
6+
Emakefun_DCMotor *DCmotor1 = Pwm.getMotor(1);
7+
Emakefun_DCMotor *DCmotor2 = Pwm.getMotor(2);
8+
Emakefun_DCMotor *DCmotor3 = Pwm.getMotor(3);
9+
Emakefun_DCMotor *DCmotor4 = Pwm.getMotor(4);
10+
11+
DCmotor1->setSpeed(255);
12+
DCmotor2->setSpeed(255);
13+
DCmotor3->setSpeed(255);
14+
DCmotor4->setSpeed(255);
15+
16+
while (1) {
17+
DCmotor1->run(FORWARD);
18+
DCmotor2->run(FORWARD);
19+
DCmotor3->run(FORWARD);
20+
DCmotor4->run(FORWARD);
21+
delay(1000);
22+
DCmotor1->run(BACKWARD);
23+
DCmotor2->run(BACKWARD);
24+
DCmotor3->run(BACKWARD);
25+
DCmotor4->run(BACKWARD);
26+
delay(1000);
27+
}
28+
}
Lines changed: 83 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,101 @@
1-
/***
2-
* author : FENN MAI
3-
* last modified date: 30/05/2024
1+
/**
2+
* @file Emakefun_MotorDriver.cpp
3+
* @brief 控制舵机和直流齿轮电机
44
*
5-
* Basic 3.0, date: 29/05/2024
6-
* changed the code from wiringPi to pigpio to control the servo and DC gear motor
5+
* @author FENN MAI
6+
* @date 30/05/2024
7+
* @version Basic 3.0
78
*
9+
* Version: Basic 3.0
10+
* 修改日期:2024年5月29日
11+
* 变更内容:将代码从wiringPi改为pigpio,以控制舵机和直流齿轮电机。
812
*/
13+
914
#include "Emakefun_MotorDriver.h"
1015
#include <cmath>
1116
#include <pigpio.h>
12-
// addr = 0x60
13-
Emakefun_MotorDriver::Emakefun_MotorDriver(uint8_t addr) { _i2caddr = addr; }
1417

18+
/**
19+
* @brief 构造函数,初始化I2C地址。
20+
* @param addr I2C地址,默认值为0x60。
21+
*/
22+
Emakefun_MotorDriver::Emakefun_MotorDriver(uint8_t addr) {
23+
_i2caddr = addr;
24+
}
25+
26+
/**
27+
* @brief 初始化I2C通信并重置PCA9685设备。
28+
*/
1529
void Emakefun_MotorDriver::begin(void) {
16-
Raspi_I2C::init(_i2caddr);
17-
reset();
30+
Raspi_I2C::init(_i2caddr); // 初始化I2C通信
31+
reset(); // 重置PCA9685设备
1832
}
1933

20-
void Emakefun_MotorDriver::reset(void) { write8(PCA9685_MODE1, 0x00); }
34+
/**
35+
* @brief 重置PCA9685设备。
36+
*/
37+
void Emakefun_MotorDriver::reset(void) {
38+
write8(PCA9685_MODE1, 0x00);
39+
}
2140

41+
/**
42+
* @brief 设置PWM频率。
43+
* @param freq 频率值。
44+
*/
2245
void Emakefun_MotorDriver::setPWMFreq(float freq) {
23-
// printf("Attempting to set freq :%lf \n",freq);
24-
25-
// freq *= 0.9; // Correct for overshoot in the frequency setting (see issue
26-
// #11).
27-
28-
float prescaleval = 25000000;
29-
prescaleval /= 4096;
30-
prescaleval /= freq;
31-
prescaleval -= 1;
32-
uint8_t prescale = floor(prescaleval + 0.5);
33-
34-
uint8_t oldmode = read8(PCA9685_MODE1);
35-
uint8_t newmode = (oldmode & 0x7F) | 0x10; // sleep
36-
write8(PCA9685_MODE1, newmode); // go to sleep
37-
write8(PCA9685_PRESCALE, prescale); // set the prescaler
38-
write8(PCA9685_MODE1, oldmode);
39-
gpioDelay(5000);
40-
write8(PCA9685_MODE1,
41-
oldmode | 0xa1); // This sets the MODE1 register to turn on auto increment.
42-
// This is why the beginTransmission below was not working.
43-
// Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
46+
float prescaleval = 25000000.0f; // 固定时钟频率
47+
prescaleval /= 4096.0f; // 分辨率
48+
prescaleval /= freq; // 频率
49+
prescaleval -= 1.0f;
50+
uint8_t prescale = static_cast<uint8_t>(floor(prescaleval + 0.5f));
51+
52+
uint8_t oldmode = read8(PCA9685_MODE1);
53+
uint8_t newmode = (oldmode & 0x7F) | 0x10; // 进入睡眠模式
54+
write8(PCA9685_MODE1, newmode); // 进入睡眠模式
55+
write8(PCA9685_PRESCALE, prescale); // 设置预分频器
56+
write8(PCA9685_MODE1, oldmode); // 退出睡眠模式
57+
gpioDelay(5000); // 等待5ms
58+
write8(PCA9685_MODE1, oldmode | 0xA1); // 开启自动递增
4459
}
4560

61+
/**
62+
* @brief 设置PWM输出。
63+
* @param num PWM通道号。num(0,15)
64+
* @param on PWM开启时间。PWM 开始时间(0-4095),表示 PWM 周期中信号从低到高的时间点。
65+
* @param off PWM关闭时间。PWM 结束时间(0-4095),表示 PWM 周期中信号从高到低的时间点。
66+
*/
4667
void Emakefun_MotorDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
47-
// Serial.print("Setting PWM "); Serial.print(num); Serial.print(": ");
48-
// Serial.print(on); Serial.print("->"); Serial.println(off);
49-
50-
// write8(LED0_ON_L + (num << 2), on & 0xFF);
51-
// write8(LED0_ON_H + (num << 2), on >> 8);
52-
// write8(LED0_OFF_L + (num << 2), off & 0xFF);
53-
// write8(LED0_OFF_H + (num << 2), off >> 8);
54-
55-
uint8_t data[] = {static_cast<uint8_t>(LED0_ON_L + (num << 2)), static_cast<uint8_t>(on & 0xFF),
56-
static_cast<uint8_t>(on >> 8), static_cast<uint8_t>(off & 0xFF), static_cast<uint8_t>(off >> 8)};
57-
Write(data, sizeof(data));
68+
uint8_t data[] = {
69+
// LED0_ON_L 是 PCA9685 寄存器的基地址,用于设置通道 0 的 LED 开始时间低字节。
70+
// num << 2 将通道号左移两位,这是因为每个通道有四个寄存器(ON_L、ON_H、OFF_L、OFF_H)。
71+
// LED0_ON_L + (num << 2) 计算得出通道 num 的 ON_L 寄存器地址。
72+
static_cast<uint8_t>(LED0_ON_L + (num << 2)),
73+
// on & 0xFF 获取 on 的低 8 位。
74+
// on >> 8 获取 on 的高 8 位。
75+
static_cast<uint8_t>(on & 0xFF),
76+
static_cast<uint8_t>(on >> 8),
77+
// off & 0xFF 获取 off 的低 8 位。
78+
// off >> 8 获取 off 的高 8 位。
79+
static_cast<uint8_t>(off & 0xFF),
80+
static_cast<uint8_t>(off >> 8)
81+
};
82+
Write(data, sizeof(data)); // 写入数据
5883
}
5984

60-
uint8_t Emakefun_MotorDriver::read8(uint8_t addr) { return ReadReg8(addr); }
85+
/**
86+
* @brief 读取8位寄存器的值。
87+
* @param addr 寄存器地址。
88+
* @return 寄存器的8位值。
89+
*/
90+
uint8_t Emakefun_MotorDriver::read8(uint8_t addr) {
91+
return ReadReg8(addr);
92+
}
6193

62-
void Emakefun_MotorDriver::write8(uint8_t addr, uint8_t d) { WriteReg8(addr, d); }
94+
/**
95+
* @brief 向8位寄存器写入数据。
96+
* @param addr 寄存器地址。
97+
* @param d 写入的数据。
98+
*/
99+
void Emakefun_MotorDriver::write8(uint8_t addr, uint8_t d) {
100+
WriteReg8(addr, d);
101+
}

Basic_Development/New_Car_Control/Encoder_Base/Emakefun_MotorDriver.h

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
/***
2-
* author : Basav
3-
* last modified date: 02/04/2024
4-
*
5-
* Basic 3.0, date: 27/03/2024
6-
* changed the code from wiringPi to pigpio to control the servo and DC gear
1+
/**
72
*
3+
* @author FENN MAI
4+
* @date 06/05/2024
5+
* @version Basic 4.0
6+
* @brief 编码电机初次测试
87
*/
8+
9+
910
#ifndef _Emakefun_MotorDriver_H
1011
#define _Emakefun_MotorDriver_H
1112

1213
#include "Raspi_i2c.h"
1314

15+
// PCA9685寄存器地址定义
1416
#define PCA9685_SUBADR1 0x2
1517
#define PCA9685_SUBADR2 0x3
1618
#define PCA9685_SUBADR3 0x4
@@ -28,18 +30,58 @@
2830
#define ALLLED_OFF_L 0xFC
2931
#define ALLLED_OFF_H 0xFD
3032

33+
/**
34+
* @class Emakefun_MotorDriver
35+
* @brief 通过I2C控制PCA9685芯片的类,继承自Raspi_I2C类。
36+
*/
3137
class Emakefun_MotorDriver : public Raspi_I2C {
3238
public:
39+
/**
40+
* @brief 构造函数,初始化I2C地址。
41+
* @param addr I2C地址,默认值为0x60。
42+
*/
3343
Emakefun_MotorDriver(uint8_t addr = 0x60);
44+
45+
/**
46+
* @brief 初始化I2C连接和PCA9685芯片。
47+
*/
3448
void begin(void);
49+
50+
/**
51+
* @brief 重置PCA9685芯片。
52+
*/
3553
void reset(void);
54+
55+
/**
56+
* @brief 设置PWM频率。
57+
* @param freq 频率值。
58+
*/
3659
void setPWMFreq(float freq);
60+
61+
/**
62+
* @brief 设置PWM输出。
63+
* @param num PWM通道号。
64+
* @param on PWM开启时间。
65+
* @param off PWM关闭时间。
66+
*/
3767
void setPWM(uint8_t num, uint16_t on, uint16_t off);
3868

3969
private:
40-
uint8_t _i2caddr;
70+
uint8_t _i2caddr; ///< I2C地址
71+
72+
/**
73+
* @brief 读取8位寄存器的值。
74+
* @param addr 寄存器地址。
75+
* @return 寄存器的8位值。
76+
*/
4177
uint8_t read8(uint8_t addr);
78+
79+
/**
80+
* @brief 向8位寄存器写入数据。
81+
* @param addr 寄存器地址。
82+
* @param d 写入的数据。
83+
*/
4284
void write8(uint8_t addr, uint8_t d);
4385
};
4486

45-
#endif
87+
#endif // _Emakefun_MotorDriver_H

0 commit comments

Comments
 (0)