电赛debug随笔

已经寄了,对电赛没有多少用处了(悲伤)

TIM1 PWM 不输出

没有开启主输出以及TIMx在ARR上的预装载寄存器。
部分可行的代码如下:

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

// 死区时间设置
#define PWM_deadtime_ms ((uint16_t)500)

typedef struct{
float pwm_rate; // 占空比(高电平的占空比)
uint16_t pwm_psc; // 作为TIMx时钟频率除数的预分频值 psc
uint16_t pwm_arr; // 在下一个更新事件装入活动的自动重装载寄存器周期的值 arr,在一定 psc 下正比于 period
}PWM_channel_data_typedef;

#define PWM_use_channel_0
#define PWM_use_channel_1
#define PWM_use_channel_2
// #define PWM_use_deadtime

#define PWM_cktim ((u32)72000000uL)
#define PWM_deadtime (uint16_t)((unsigned long long)PWM_cktim / 2 * (unsigned long long)PWM_deadtime_ms / ((unsigned long long)1000000000))

#define PWM_channel_0_tim TIM1
#define PWM_channel_1_tim TIM2
#define PWM_channel_2_tim TIM3

PWM_channel_data_typedef PWM_channel_data[3]; // 0->h, 1->l

// ......

//*********************** channel 0 ***********************//
#ifdef PWM_use_channel_0
PWM_channel_data[0].pwm_psc = 7200; //
PWM_channel_data[0].pwm_arr = 10; //
PWM_channel_data[0].pwm_rate = 0;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_8);

// 初始化TIM
TIM_TimeBaseStructure.TIM_Prescaler = PWM_channel_data[0].pwm_psc - 1; // 设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_Period = PWM_channel_data[0].pwm_arr - 1; // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 设置时钟分频:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(PWM_channel_0_tim, &TIM_TimeBaseStructure); // 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

// 初始化TIM Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(PWM_channel_0_tim, &TIM_OCInitStructure); // 根据T指定的参数初始化外设TIM1 OC3

TIM_CtrlPWMOutputs(PWM_channel_0_tim, ENABLE); // 主输出使能
TIM_OC1PreloadConfig(PWM_channel_0_tim, TIM_OCPreload_Enable); // 使能TIMx_CH1预装载寄存器
TIM_ARRPreloadConfig(PWM_channel_0_tim, ENABLE); // 使能那个TIMx在ARR上的预装载寄存器

// TIM1 死区设置并开启
#ifdef PWM_use_deadtime
TIM_BDTRInitTypeDef tim_bdtr_init_structure;
tim_bdtr_init_structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
tim_bdtr_init_structure.TIM_Break = TIM_Break_Disable;
tim_bdtr_init_structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
tim_bdtr_init_structure.TIM_DeadTime = PWM_deadtime; // 死区时间
tim_bdtr_init_structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
tim_bdtr_init_structure.TIM_OSSIState = TIM_OSSIState_Enable;
tim_bdtr_init_structure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRConfig(PWM_channel_0_tim, &tim_bdtr_init_structure);
#endif // PWM_use_deadtime

TIM_Cmd(PWM_channel_0_tim, DISABLE); // 保持 PWM_channel_0_tim 失能,请调用 PWM_start(0); 以启动 PWM 输出
#endif // PWM_use_channel_0

时钟频率的计算

其实根本没那么复杂。
对于STM32F103C8T6最小系统板而言,就是72MHz除以分频数,然后用重装计数器考虑计数个数,就可以得到定时器的触发频率或者是PWM的输出频率了。

sin table

用python搞了一个

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
import math

# 配置信息
step_size = 1 # 步长
line_limit = 30 # 行数据量限制
file_name = 'sin_table' # header文件名

if __name__ == '__main__':
dat = []
for i in range(0, int(360 / step_size / line_limit)):
for j in range(0, line_limit):
dat += [math.sin((line_limit * step_size * i + step_size * j) / 180 * math.pi)]
with open(f'./{file_name}.h', mode='w') as file:
file.write(f'#ifndef __{file_name}_h\n')
file.write(f'#define __{file_name}_h\n')
file.write('\n')
file.write('// 正弦表\n')
file.write(f'double {file_name}[] = ' + '{\n')
file.write('\t')
for index, val in enumerate(dat):
if index != 0 and index % line_limit == 0:
file.write('\n')
file.write('\t')
file.write(f'{val:.3f}, ')
file.write('\n')
file.write('};\n')
file.write('\n')
file.write(f'#endif // __{file_name}_h\n')

sin_table.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef __sin_table_h
#define __sin_table_h

// 正弦表
double sin_table[] = {
0.000, 0.017, 0.035, 0.052, 0.070, 0.087, 0.105, 0.122, 0.139, 0.156, 0.174, 0.191, 0.208, 0.225, 0.242, 0.259, 0.276, 0.292, 0.309, 0.326, 0.342, 0.358, 0.375, 0.391, 0.407, 0.423, 0.438, 0.454, 0.469, 0.485,
0.500, 0.515, 0.530, 0.545, 0.559, 0.574, 0.588, 0.602, 0.616, 0.629, 0.643, 0.656, 0.669, 0.682, 0.695, 0.707, 0.719, 0.731, 0.743, 0.755, 0.766, 0.777, 0.788, 0.799, 0.809, 0.819, 0.829, 0.839, 0.848, 0.857,
0.866, 0.875, 0.883, 0.891, 0.899, 0.906, 0.914, 0.921, 0.927, 0.934, 0.940, 0.946, 0.951, 0.956, 0.961, 0.966, 0.970, 0.974, 0.978, 0.982, 0.985, 0.988, 0.990, 0.993, 0.995, 0.996, 0.998, 0.999, 0.999, 1.000,
1.000, 1.000, 0.999, 0.999, 0.998, 0.996, 0.995, 0.993, 0.990, 0.988, 0.985, 0.982, 0.978, 0.974, 0.970, 0.966, 0.961, 0.956, 0.951, 0.946, 0.940, 0.934, 0.927, 0.921, 0.914, 0.906, 0.899, 0.891, 0.883, 0.875,
0.866, 0.857, 0.848, 0.839, 0.829, 0.819, 0.809, 0.799, 0.788, 0.777, 0.766, 0.755, 0.743, 0.731, 0.719, 0.707, 0.695, 0.682, 0.669, 0.656, 0.643, 0.629, 0.616, 0.602, 0.588, 0.574, 0.559, 0.545, 0.530, 0.515,
0.500, 0.485, 0.469, 0.454, 0.438, 0.423, 0.407, 0.391, 0.375, 0.358, 0.342, 0.326, 0.309, 0.292, 0.276, 0.259, 0.242, 0.225, 0.208, 0.191, 0.174, 0.156, 0.139, 0.122, 0.105, 0.087, 0.070, 0.052, 0.035, 0.017,
0.000, -0.017, -0.035, -0.052, -0.070, -0.087, -0.105, -0.122, -0.139, -0.156, -0.174, -0.191, -0.208, -0.225, -0.242, -0.259, -0.276, -0.292, -0.309, -0.326, -0.342, -0.358, -0.375, -0.391, -0.407, -0.423, -0.438, -0.454, -0.469, -0.485,
-0.500, -0.515, -0.530, -0.545, -0.559, -0.574, -0.588, -0.602, -0.616, -0.629, -0.643, -0.656, -0.669, -0.682, -0.695, -0.707, -0.719, -0.731, -0.743, -0.755, -0.766, -0.777, -0.788, -0.799, -0.809, -0.819, -0.829, -0.839, -0.848, -0.857,
-0.866, -0.875, -0.883, -0.891, -0.899, -0.906, -0.914, -0.921, -0.927, -0.934, -0.940, -0.946, -0.951, -0.956, -0.961, -0.966, -0.970, -0.974, -0.978, -0.982, -0.985, -0.988, -0.990, -0.993, -0.995, -0.996, -0.998, -0.999, -0.999, -1.000,
-1.000, -1.000, -0.999, -0.999, -0.998, -0.996, -0.995, -0.993, -0.990, -0.988, -0.985, -0.982, -0.978, -0.974, -0.970, -0.966, -0.961, -0.956, -0.951, -0.946, -0.940, -0.934, -0.927, -0.921, -0.914, -0.906, -0.899, -0.891, -0.883, -0.875,
-0.866, -0.857, -0.848, -0.839, -0.829, -0.819, -0.809, -0.799, -0.788, -0.777, -0.766, -0.755, -0.743, -0.731, -0.719, -0.707, -0.695, -0.682, -0.669, -0.656, -0.643, -0.629, -0.616, -0.602, -0.588, -0.574, -0.559, -0.545, -0.530, -0.515,
-0.500, -0.485, -0.469, -0.454, -0.438, -0.423, -0.407, -0.391, -0.375, -0.358, -0.342, -0.326, -0.309, -0.292, -0.276, -0.259, -0.242, -0.225, -0.208, -0.191, -0.174, -0.156, -0.139, -0.122, -0.105, -0.087, -0.070, -0.052, -0.035, -0.017,
};

#endif // __sin_table_h

SPWM序列生成器

参考https://blog.csdn.net/god_yutaixin/article/details/103657208

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
import numpy as np
import scipy.integrate as si

timerCLK = 72000000 # 72MHz / 分频
arr = 3600 - 1 # ARR
f = 50 # 频率
amp_scale = 0.75 # 调幅
file_name = 'spwm_table' # 不带后缀的文件名
file_line_limit = 30 # 行数据量限制
###########################################################
base_rate = timerCLK / (arr + 1) # 载波频率
t = 1 / f # 周期
n = round(base_rate / f) # 一周波分段数量
step_size = 1 / f / n # 步长
result = []


def spwm_sin(x):
global f
return np.sin(2 * np.pi * f * x)


if __name__ == '__main__':
ccr = range(1, n + 1)
for i in ccr:
area = si.quad(spwm_sin, (i - 1) * step_size, i * step_size)[0] # 求积分
result += [round((amp_scale * area * arr / step_size + arr) / 2)]

with open(f'./{file_name}.h', mode='w') as file:
file.write(f'#ifndef __{file_name}_h\n')
file.write(f'#define __{file_name}_h\n')

file.write('\n')
file.write(f'#define spwm_n {n}\n')
file.write('\n')
file.write(f'// \n')
file.write(f'// timerCLK = {timerCLK};\n')
file.write(f'// f = {f};\n')
file.write(f'// amp_scale = {amp_scale};\n')
file.write(f'// arr = {arr};\n')
file.write(f'// \n')
file.write(f'// base_rate = {base_rate};\n')
file.write(f'// step_size = {step_size};\n')
file.write(f'// n = {n};\n')
file.write(f'// \n')
file.write('\n')
file.write('const unsigned short {file_name}[spwm_n] = '.format(file_name=file_name) + '{\n')

for index, val in enumerate(result):
if index != 0 and index % file_line_limit == 0:
file.write('\n')
continue
file.write(f'{val},')

file.write('};\n')
file.write('\n')

file.write(f'#endif // __{file_name}_h\n')

STM32F407最小系统板相关

开始去除写保护

我用的是Flymcu下载软件。
烧录的时候一直卡在这里,四个小时里面找不到解决方案。
后来参考了这篇STM32读保护的解除和出现的原因,使用串口和ST-LINK Utility解除读保护,问题解决。
先清除芯片,然后再下载;用STM32 ST-LINK Utility下载而不是Flymcu,因为Flymcu会把读保护给加回去……
最终选择了ST-LINK。

新的片上资源

相比于F103,F407为我们带来了更多的片上资源,例如更多的通信串口、DMA、中断等等。

stm32f103与407的不同点总结

TIM1、TIM8-TIM11的时钟为APB2时钟的两倍即168M,TIM2-TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M。

STM32F407引脚资源总结

总的来说,STM32F407,拥有更多的外设:它的时钟多达14个,其中168MHz的一堆,84MHz的一堆,42MHz的一堆

IR2103 的坑

这是IR2103的原理图

IR2103原理图

这是官方示例

IR2103原理图

但是我们为了减少单片机引脚占用,将HIN和LIN连到了一起,结果就是IR2103因为内部的上拉、下拉,从而无法获得来自单片机的有效输入。

自制PCB

2023年7月12日:跟着老师学习了PCB制作流程。后面手动制板的时候会分享踩过的坑。

F103扩展版

我自己画的第一块板子

写一下今天做F103扩展板的需求思路:

  1. 给出通常进行的连接选择但保留二次选择的余地(例如计划以后将B11、B10作为OLED的SCL和SDA,但不直接连接,将B11和B10的端子靠近放置,以后用跳线帽进行实际的连接)
  2. 电源输入给出扩展位置
  3. 带一些基本的配置,例如蜂鸣器、按键、调试用的LED指示灯

不足之处:

  • 我拿覆铜当丝印写字。
  • 耗时过长(耗时一上午)

ADC采样板

不足之处:没有做三相采样,只做了两相,重置ing

三相ADC

晚上睡不着起来画板子玩,并给三相ADC点了个加急。
刚要睡着,™D突然想起来四个角上没打过孔,™D又跑下床赶紧取消订单打过孔重下。
™D,睡眠完全崩了

ACDC原理

AC输入->(PWM1+变压器+电容)波形似乎不是很好的高压DC->(PWM2+电容)DC

大概是:AC->DC made by L & C & PWM->Target DC made by C & PWM

锁相环与变换

Park变换

4种派克(Park)变换、克拉克(Clark)变换与基于dq轴解耦的双闭环控制之间的关系(一)

锁相环

一文弄懂锁相环(PLL)的工作原理及应用

“单发着陆”失败了,本上拉电阻没能把电压给拉上去。感觉今年电赛无望了。

奥里给

无论如何,我努力了一个月了,最后,是骡子是马,拉出来遛遛就知道了!加油,奥里给!

结果

寄。

References

2021年B题——三相AC-DC变换电路 赚钱靠团队

作者

勇敢梧桐树

发布于

2023-07-10

更新于

2023-08-25

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×