外观
继电器输出实验
电路分析
mos管分析
数控直流电源板使用三个固态继电器来对电压进行控制,GPIO引脚连接发光二极管的阴极,低电平时二极管导通,从而使内部MOS管导通。
当打开CON1时,来自TYPEC接口的VBUS电压连接到输出,该电压默认输出5V,可诱骗输出9V、12V等等。
当打开CON2时,来自DCDC芯片的3.3V连接到输出;当打开CON3时,来自LDO的1.8V连接到输出;
CH224K分析
VBUS的电压,可通过CH224K电源诱骗芯片来进行设置,该芯片最高支持诱骗20V输出,但一般项目对于15V、20V电压应用较少,且很多项目所用电容耐压值为16V,这里在软件中仅设置到12V,后续大家可根据需要自行调整。
考虑到大部分板子在日常使用中使用5V系统较多,这里在CFG1上加入一个电阻,默认上拉到高电平来控制VBUS默认输出5V。
最后需要注意一点:部分充电器仅支持5V输出,或不支持某些电压诱骗输出,详细请根据实际的充电器参数来。
功能实现
创建工程
- 打开cubemx软件,配置工程;在此之前需要确保你已经成功安装stm32cubemx软件以及keil软件并下载好对应的芯片支持包了。
注
固态继电器相关引脚默认要拉高,这是为了默认关断固态继电器,同时有一点,切勿把三个引脚都同时拉低,在同一时刻只能有一个固态继电器打开,否则高电压会影响低电压,这一点在配置以及后续代码编写过程中都非常重要。
ch224是电源诱骗芯片,我们可以通过控制对应的引脚来控制输出电压,配置的电平需参考数据手册,默认cfg为1输出5V电平比较合适。
代码实现
默认生成的代码编译是没有任何问题的,若有问题,基本上就是环境文件,需要重新检查安装,建议把错误信息复制到百度进行查找解决。
gpio.c实现相关的GPIO操作代码,注意需要有一点点c语言基础,hal库对于各类操作进行了抽象封装,可以在stm32f0xx_hal_gpio文件中找到相关的操作函数,这里仅使用:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
用于对应GPIO引脚输出高低电平。
继电器输出实验部分代码
C
/* USER CODE BEGIN 2 */
/*
函数内容:设置ch224引脚电平,以改变输出电压值
函数参数:设置输出电压值
*/
static void setch224(uint16_t setVol)
{
if(setVol == VOL_5V0){
HAL_GPIO_WritePin(CFG1_GPIO_Port,CFG1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(CFG2_GPIO_Port,CFG2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG3_GPIO_Port,CFG3_Pin,GPIO_PIN_RESET);
}
else if(setVol == VOL_9V0){
HAL_GPIO_WritePin(CFG1_GPIO_Port,CFG1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG2_GPIO_Port,CFG2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG3_GPIO_Port,CFG3_Pin,GPIO_PIN_RESET);
}
else if(setVol == VOL_12V){
HAL_GPIO_WritePin(CFG1_GPIO_Port,CFG1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG2_GPIO_Port,CFG2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG3_GPIO_Port,CFG3_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(CFG1_GPIO_Port,CFG1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(CFG2_GPIO_Port,CFG2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG3_GPIO_Port,CFG3_Pin,GPIO_PIN_RESET);
}
}
/*
函数内容:控制VBUS也就是5V、9V、12V
函数参数:打开或关闭
*/
static void controlVBUS(uint8_t con)
{
if(con == OPENPOWER){
HAL_GPIO_WritePin(CON_IO1_GPIO_Port,CON_IO1_Pin,GPIO_PIN_RESET);
}
else if(con == CLOSEPOWER){
HAL_GPIO_WritePin(CON_IO1_GPIO_Port,CON_IO1_Pin,GPIO_PIN_SET);
}
}
/*
函数内容:控制3.3V
函数参数:打开或关闭
*/
static void control3V3(uint8_t con)
{
if(con == OPENPOWER){
HAL_GPIO_WritePin(CON_IO2_GPIO_Port,CON_IO2_Pin,GPIO_PIN_RESET);
}
else if(con == CLOSEPOWER){
HAL_GPIO_WritePin(CON_IO2_GPIO_Port,CON_IO2_Pin,GPIO_PIN_SET);
}
}
/*
函数内容:控制1.8V
函数参数:打开或关闭
*/
static void control1V8(uint8_t con)
{
if(con == OPENPOWER){
HAL_GPIO_WritePin(CON_IO3_GPIO_Port,CON_IO3_Pin,GPIO_PIN_RESET);
}
else if(con == CLOSEPOWER){
HAL_GPIO_WritePin(CON_IO3_GPIO_Port,CON_IO3_Pin,GPIO_PIN_SET);
}
}
/*
函数内容:打开电源开关,也就是固态继电器
函数参数:输出电压值
*/
void OpenPowerSwitch(uint8_t value)
{
switch(value)
{
case VOL_1V8:
{
setch224(VOL_5V0);
control1V8(OPENPOWER);
control3V3(CLOSEPOWER);
controlVBUS(CLOSEPOWER);
}
break;
case VOL_3V3:
{
setch224(VOL_5V0);
control1V8(CLOSEPOWER);
control3V3(OPENPOWER);
controlVBUS(CLOSEPOWER);
}
break;
case VOL_5V0:
{
setch224(VOL_5V0);
control1V8(CLOSEPOWER);
control3V3(CLOSEPOWER);
controlVBUS(OPENPOWER);
}
break;
case VOL_9V0:
{
setch224(VOL_9V0);
control1V8(CLOSEPOWER);
control3V3(CLOSEPOWER);
controlVBUS(OPENPOWER);
}
break;
case VOL_12V:
{
setch224(VOL_12V);
control1V8(CLOSEPOWER);
control3V3(CLOSEPOWER);
controlVBUS(OPENPOWER);
}
break;
default:
{
setch224(VOL_5V0);
control1V8(CLOSEPOWER);
control3V3(CLOSEPOWER);
controlVBUS(OPENPOWER);
}
break;
}
}
/*
函数内容:关闭电源开关
函数参数:无
*/
void ClosePowerSwitch(void)
{
setch224(VOL_5V0);
control1V8(CLOSEPOWER);
control3V3(CLOSEPOWER);
controlVBUS(CLOSEPOWER);
}
/* USER CODE END 2 */
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
C
#ifndef __GPIO_H__
#define __GPIO_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* USER CODE BEGIN Private defines */
#define OPENPOWER 0x20
#define CLOSEPOWER 0x21
#define VOL_1V8 0x10
#define VOL_3V3 0x11
#define VOL_5V0 0x12
#define VOL_9V0 0x13
#define VOL_12V 0x14
/* USER CODE END Private defines */
void MX_GPIO_Init(void);
/* USER CODE BEGIN Prototypes */
void OpenPowerSwitch(uint8_t value);
void ClosePowerSwitch(void);
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /*__ GPIO_H__ */
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
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
C
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
OpenPowerSwitch(VOL_5V0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
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
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
TIP
当代码烧录进去后,使用万用表测试输出接口电压,应该是有5V输出的,然后也可以直接尝试更换输出电压,看看效果;
一定注意不可同时打开多个继电器,这里再三强调。
若发现输出9V、12V失败,可以看看自己的充电头或充电线是不是不支持该电压输出。