电赛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
// 死区时间设置
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_deadtime
PWM_channel_data_typedef PWM_channel_data[3]; // 0->h, 1->l
// ......
//*********************** 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 死区设置并开启
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);
TIM_Cmd(PWM_channel_0_tim, DISABLE); // 保持 PWM_channel_0_tim 失能,请调用 PWM_start(0); 以启动 PWM 输出
时钟频率的计算
其实根本没那么复杂。
对于STM32F103C8T6最小系统板而言,就是72MHz除以分频数,然后用重装计数器考虑计数个数,就可以得到定时器的触发频率或者是PWM的输出频率了。
sin table
用python搞了一个
1 | import math |
sin_table.h
1 |
|
SPWM序列生成器
参考https://blog.csdn.net/god_yutaixin/article/details/103657208
1 | import numpy as np |
STM32F407最小系统板相关
开始去除写保护
我用的是Flymcu下载软件。
烧录的时候一直卡在这里,四个小时里面找不到解决方案。
后来参考了这篇STM32读保护的解除和出现的原因,使用串口和ST-LINK Utility解除读保护,问题解决。
先清除芯片,然后再下载;用STM32 ST-LINK Utility下载而不是Flymcu,因为Flymcu会把读保护给加回去……
最终选择了ST-LINK。
新的片上资源
相比于F103,F407为我们带来了更多的片上资源,例如更多的通信串口、DMA、中断等等。
TIM1、TIM8-TIM11的时钟为APB2时钟的两倍即168M,TIM2-TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M。
总的来说,STM32F407,拥有更多的外设:它的时钟多达14个,其中168MHz的一堆,84MHz的一堆,42MHz的一堆
IR2103 的坑
这是IR2103的原理图
这是官方示例
但是我们为了减少单片机引脚占用,将HIN和LIN连到了一起,结果就是IR2103因为内部的上拉、下拉,从而无法获得来自单片机的有效输入。
自制PCB
F103扩展版
我自己画的第一块板子
写一下今天做F103扩展板的需求思路:
- 给出通常进行的连接选择但保留二次选择的余地(例如计划以后将B11、B10作为OLED的SCL和SDA,但不直接连接,将B11和B10的端子靠近放置,以后用跳线帽进行实际的连接)
- 电源输入给出扩展位置
- 带一些基本的配置,例如蜂鸣器、按键、调试用的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轴解耦的双闭环控制之间的关系(一)
锁相环
寄
“单发着陆”失败了,本上拉电阻没能把电压给拉上去。感觉今年电赛无望了。
奥里给
无论如何,我努力了一个月了,最后,是骡子是马,拉出来遛遛就知道了!加油,奥里给!
结果
寄。