全国大学生电子设计大赛
keil开发环境配置
1.CCS开发学习链接
2.keil+sysconfig开发
CCS常用方法
多文件编译
如何在CCS中添加文件路径
keil+Syconfig开发出现常见问题及其解决方法
1.在导入SDK中Syconfig文件时候没用Import选项:说明版本太低需要更新Kei版本
2.出现错误:Missing argument: —board or —device must be specified解决方法
参考链接: Missing argument: —board or —device must be specified解决方法
确保在该文件显示在屏幕上时,再打开SysConfig
CCS基础及其TI
GPIO
1 |
|
系统时钟
1 | // SysTick->VAL,滴答定时器去延迟 |
SY配置
阻塞延迟和非阻塞延迟:
采用空语句的方式,称为阻塞延迟
采用中断的方式,称为非阻塞延迟
邓兄给的代码:
串口通信
1 |
|
PWM输出
SY设置:
!SY设置
1 |
|
常用模块
OLED屏幕
MPU6050
刚刚移MPU库,移半天一堆错,想想还是自己积分算角度吧
学习链接: !基于江科大MPU6050移植进入MSPM0
基于江科大MPU6050姿态解算代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// 加速度和角速度
int16_t AX, AY, AZ, GX, GY, GZ;
typedef struct {
float c1, c2, c3, a1, a2, a3, a;
} Degree;
Degree d;
typedef struct {
float q0, q1, q2, q3;
float exInt, eyInt, ezInt;
} Quater;
Quater q = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
void Dmp_Init(void) {
MPU6050_Init();
}
void MPU6050_Read(void) {
MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);
// 转换为物理量
d.c1 = GX / 131.0f; // 角速度(°/s)
d.c2 = GY / 131.0f;
d.c3 = GZ / 131.0f;
// 转换为rad/s
d.c1 /= RtA;
d.c2 /= RtA;
d.c3 /= RtA;
d.a1 = AX / 16384.0f; // 加速度(g)
d.a2 = AY / 16384.0f;
d.a3 = AZ / 16384.0f;
// 加速度归一化
float norm = sqrtf(d.a1 * d.a1 + d.a2 * d.a2 + d.a3 * d.a3);
if (norm > 1e-6f) { // 防止除零
float inv_norm = 1.0f / norm;
d.a1 *= inv_norm;
d.a2 *= inv_norm;
d.a3 *= inv_norm;
d.a = 1.0f;
} else {
d.a = 0.0f;
}
}
void ComputeEulerAngles(float *pitch, float *roll, float *yaw) {
MPU6050_Read();
// 计算姿态误差
float gx = d.c1, gy = d.c2, gz = d.c3;
float gravity_x = 2.0f * (q.q1 * q.q3 - q.q0 * q.q2);
float gravity_y = 2.0f * (q.q0 * q.q1 + q.q2 * q.q3);
float gravity_z = q.q0*q.q0 - q.q1 * q.q1 - q.q2 * q.q2 + q.q3*q.q3;
float error_x = d.a2 * gravity_z - d.a3 * gravity_y;
float error_y = d.a3 * gravity_x - d.a1 * gravity_z;
float error_z = d.a1 * gravity_y - d.a2 * gravity_x;
// 更新四元数
float Kp = 0.5f;
// 误差积分
q.exInt += Ki * error_x ;
q.eyInt += Ki * error_y ;
q.ezInt += Ki * error_z ;
// 修正角速度
gx += Kp * error_x + q.exInt;
gy += Kp * error_y + q.eyInt;
gz += Kp * error_z + q.ezInt;
// 四元数微分方程
float q0_dot = (-q.q1 * gx - q.q2 * gy - q.q3 * gz) * DT;
float q1_dot = (q.q0 * gx - q.q3 * gy + q.q2 * gz) * DT;
float q2_dot = (q.q3 * gx + q.q0 * gy - q.q1 * gz) * DT;
float q3_dot = (-q.q2 * gx + q.q1 * gy + q.q0 * gz) * DT;
// 更新四元数
q.q0 += q0_dot;
q.q1 += q1_dot;
q.q2 += q2_dot;
q.q3 += q3_dot;
// 归一化
float norm = sqrtf(q.q0 * q.q0 + q.q1 * q.q1 + q.q2 * q.q2 + q.q3 * q.q3);
if (norm > 1e-6f) {
float inv_norm = 1.0f / norm;
q.q0 *= inv_norm;
q.q1 *= inv_norm;
q.q2 *= inv_norm;
q.q3 *= inv_norm;
}
// 计算欧拉角
float q0q0 = q.q0 * q.q0;
float q1q1 = q.q1 * q.q1;
float q2q2 = q.q2 * q.q2;
float q3q3 = q.q3 * q.q3;
*roll = atan2f(2.0f * (q.q2 * q.q3 + q.q0 * q.q1), q0q0 - q1q1 - q2q2 + q3q3);
*pitch = asinf(-2.0f * (q.q1 * q.q3 - q.q0 * q.q2));
*yaw = atan2f(2.0f * (q.q1 * q.q2 + q.q0 * q.q3), q0q0 + q1q1 - q2q2 - q3q3);
// // 转换为度
// *roll *= RtA;
// *pitch *= RtA;
// *yaw *= RtA;
}