外观
四、代码介绍
总体概述
项目使用STM32F407VET6作为主控芯片,代码使用HAL库、STM32Cubemx进行图形化配置+Keil5进行编译,用户仅需关注逻辑代码实现即可。
该项目代码并不复杂,使用功能仅有SPI、ADC、GPIO输入输出三个模块;处理的重点在屏幕数据的显示以及按键交换和修改;
屏幕数据显示
屏幕驱动不做介绍,移植厂商给的驱动即可。重点关注屏幕数据显示,我将屏幕数据显示分为三个部分,静态数据显示、动态数据显示、按键数据显示;
- 静态数据显示:指UI边框、提示标题等信息,这些信息后续不会修改,所以只需要操作一遍即可,不用反复刷新;
- 动态数据显示:指实时获取的输出电压、输出电流、间隔时间内的峰值、谷值等信息,这些信息需要不断更新;
- 按键数据显示:指通过按键交互从而发生改变的数据,比如输出电压设置、阈值电流设置,没有按键交互时也不会更新;
C
/*
* 函数内容: 显示静态UI效果
* 函数参数: 无
* 返回值: 无
*/
void TFT_ShowStaticUI(const struct KeyInfo info)
{
char showData[32]={0};
TFT_Fill(0,0,160,128,BLACK);
TFT_ShowChinese(13,2,(uint8_t *)"可调电源板",GREEN,BLACK,16,0);
TFT_ShowChinese(108,4,(uint8_t *)"输出电源",WHITE,BLACK,12,0);
TFT_ShowChinese(108,44,(uint8_t *)"设置电压",WHITE,BLACK,12,0);
TFT_ShowChinese(108,84,(uint8_t *)"阈值电流",WHITE,BLACK,12,0);
TFT_ShowString(14,101,(uint8_t *)"Vmax",WHITE,BLACK,12,0);
TFT_ShowString(66,101,(uint8_t *)"Vmin",WHITE,BLACK,12,0);
TFT_DrawLine(105,0,105,128,GREEN);
TFT_DrawLine(0,20,168,20,GREEN);
TFT_DrawLine(105,40,168,40,GREEN);
TFT_DrawLine(105,60,168,60,GREEN);
TFT_DrawLine(105,80,168,80,GREEN);
TFT_DrawLine(0,100,168,100,GREEN);
TFT_DrawLine(52,100,52,128,GREEN);
TFT_DrawLine(0,114,105,114,GREEN);
if(info.isOut == OPEN_VOL){
sprintf(showData,"OPEN "); //显示电源开关状态
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
else{
sprintf(showData,"Close"); //显示电源开关状态
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
sprintf(showData,"%4.1fV",info.setVol); //显示设置电压
TFT_ShowString(118,64,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",info.ProtectCur); //显示阈值电流
TFT_ShowString(106,108,(uint8_t *)showData,YELLOW,BLACK,16,0);
memset(showData,0,32);
}
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
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
C
void TFT_ShowUI(const struct RealTimeData info)
{
char showData[32]={0};
sprintf(showData,"%5.2fV",info.Vmax); //显示Vmax
TFT_ShowString(8,115,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%5.2fV",info.Vmin); //显示Vmax
TFT_ShowString(60,115,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4.1fV",info.actualVol); //显示实际电压值
TFT_ShowString(4,24,(uint8_t *)showData,RED,BLACK,32,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",info.actualCur); //显示实际电流值
TFT_ShowString(4,64,(uint8_t *)showData,YELLOW,BLACK,32,0);
memset(showData,0,32);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C
void showCursor(const uint8_t cursor,const uint8_t isOut,const uint16_t ProtectCur,const float setVol)
{
char showData[32]={0};
switch(cursor)
{
case powerVolPage:
{
TFT_ShowChar(155,24,'<',WHITE,BLACK,12,0);
TFT_ShowChar(155,64,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,108,' ',WHITE,BLACK,12,0);
if(isOut == OPEN_VOL){
sprintf(showData,"OPEN "); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,WHITE,BLACK,12,0);
memset(showData,0,32);
}
else if(isOut == CLOSE_VOL){
sprintf(showData,"Close"); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,WHITE,BLACK,12,0);
memset(showData,0,32);
}
sprintf(showData,"%4.1fV",setVol); //显示设置电压
TFT_ShowString(118,64,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",ProtectCur); //显示阈值电流
TFT_ShowString(106,108,(uint8_t *)showData,YELLOW,BLACK,16,0);
memset(showData,0,32);
}
break;
case setVolPage1:
{
TFT_ShowChar(155,24,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,64,'<',WHITE,BLACK,12,0);
TFT_ShowChar(155,108,' ',WHITE,BLACK,12,0);
if(isOut == OPEN_VOL){
sprintf(showData,"OPEN "); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
else if(isOut == CLOSE_VOL){
sprintf(showData,"Close"); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
sprintf(showData,"%2d",(uint16_t)setVol); //显示设置电压
TFT_ShowString(118,64,(uint8_t *)showData,WHITE,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",ProtectCur); //显示阈值电流
TFT_ShowString(106,108,(uint8_t *)showData,YELLOW,BLACK,16,0);
memset(showData,0,32);
}
break;
case setVolPage2:
{
TFT_ShowChar(155,24,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,64,'<',WHITE,BLACK,12,0);
TFT_ShowChar(155,108,' ',WHITE,BLACK,12,0);
if(isOut == OPEN_VOL){
sprintf(showData,"OPEN "); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
else if(isOut == CLOSE_VOL){
sprintf(showData,"Close"); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
sprintf(showData,"%4.1fV",setVol); //显示设置电压
TFT_ShowString(118,64,(uint8_t *)showData,WHITE,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",ProtectCur); //显示阈值电流
TFT_ShowString(106,108,(uint8_t *)showData,YELLOW,BLACK,16,0);
memset(showData,0,32);
}
break;
case ProtectCurPage:
{
TFT_ShowChar(155,24,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,64,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,108,'<',WHITE,BLACK,12,0);
if(isOut == OPEN_VOL){
sprintf(showData,"OPEN "); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
else if(isOut == CLOSE_VOL){
sprintf(showData,"Close"); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
sprintf(showData,"%4.1fV",setVol); //显示设置电压
TFT_ShowString(118,64,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",ProtectCur); //显示阈值电流
TFT_ShowString(106,108,(uint8_t *)showData,WHITE,BLACK,16,0);
memset(showData,0,32);
}
break;
case NoPage:
{
TFT_ShowChar(155,24,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,64,' ',WHITE,BLACK,12,0);
TFT_ShowChar(155,108,' ',WHITE,BLACK,12,0);
if(isOut == OPEN_VOL){
sprintf(showData,"OPEN "); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
else if(isOut == CLOSE_VOL){
sprintf(showData,"Close"); //显示电源电压
TFT_ShowString(118,24,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
}
sprintf(showData,"%4.1fV",setVol); //显示设置电压
TFT_ShowString(118,64,(uint8_t *)showData,RED,BLACK,12,0);
memset(showData,0,32);
sprintf(showData,"%4dmA",ProtectCur); //显示阈值电流
TFT_ShowString(106,108,(uint8_t *)showData,YELLOW,BLACK,16,0);
memset(showData,0,32);
}
break;
default:
break;
}
}
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
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
按键处理
按键处理注意设置选项下标,根据对应的设置选项,从而进行对应的处理,此处两个按键,分别使用它的单击、双击功能,
C
void key_handle(uint8_t keyValue,struct KeyInfo *keyinfo)
{
switch(keyValue)
{
case Key1Press:
{
if((*keyinfo).isSetState == 1)
{
(*keyinfo).curPage++; //进入下一个设置选项
if((*keyinfo).curPage > ProtectCurPage) //如果到最后一个选项了
{
(*keyinfo).curPage = powerVolPage; //回到起始选项
}
showCursor((*keyinfo).curPage,(*keyinfo).isOut,(*keyinfo).ProtectCur,(*keyinfo).setVol);
}
}
break;
case Key1DoublePress:
{
//进入设置状态或从设置状态退出
if((*keyinfo).isSetState == STATE_TURE){
(*keyinfo).isSetState = STATE_FALSE; //退出设置状态
(*keyinfo).curPage = NoPage;
showCursor((*keyinfo).curPage,(*keyinfo).isOut,(*keyinfo).ProtectCur,(*keyinfo).setVol);
}
else
{
(*keyinfo).isSetState = STATE_TURE; //进入设置状态
(*keyinfo).curPage = powerVolPage; //默认进入电源电压设置界面
showCursor((*keyinfo).curPage,(*keyinfo).isOut,(*keyinfo).ProtectCur,(*keyinfo).setVol);
}
}
break;
case Key1LongPress:
break;
case Key2Press:
{
if((*keyinfo).isSetState == STATE_TURE)
{
//如果是设置状态
switch((*keyinfo).curPage)
{
case powerVolPage:
{
//电源电压设置界面,打开或关闭电源输出
if((*keyinfo).isOut == OPEN_VOL){
(*keyinfo).isOut = CLOSE_VOL;
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET); //关闭可调输出
}
else if((*keyinfo).isOut == CLOSE_VOL){
(*keyinfo).isOut = OPEN_VOL;
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET); //打开可调输出
}
}
break;
case setVolPage1:
{
//修改整数值
(*keyinfo).setVol = (*keyinfo).setVol + 1;
if((*keyinfo).setVol >= ((*keyinfo).powerVol-1)){
(*keyinfo).setVol = (*keyinfo).powerVol-1;
}
(*keyinfo).dacout = ((*keyinfo).setVol-1.221f)/4.0f; //计算实际输出多少v电压
(*keyinfo).dacout = (4096 * (*keyinfo).dacout)/3.3f; //转换为数字量进行设置
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (*keyinfo).dacout);
}
break;
case setVolPage2:
{
//修改小数值
(*keyinfo).setVol = (*keyinfo).setVol + 0.1f;
if((*keyinfo).setVol >= ((*keyinfo).powerVol-1)){
(*keyinfo).setVol = (*keyinfo).powerVol-1;
}
(*keyinfo).dacout = ((*keyinfo).setVol-1.221f)/4.0f; //计算实际输出多少v电压
(*keyinfo).dacout = (4096 * (*keyinfo).dacout)/3.3f; //转换为数字量进行设置
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (*keyinfo).dacout);
}
break;
case ProtectCurPage:
{
(*keyinfo).ProtectCur = (*keyinfo).ProtectCur + 100;
if((*keyinfo).ProtectCur >= 2000){
(*keyinfo).ProtectCur = 2000;
}
}
break;
default:
break;
}
showCursor((*keyinfo).curPage,(*keyinfo).isOut,(*keyinfo).ProtectCur,(*keyinfo).setVol);
}
}
break;
case Key2DoublePress:
{
if((*keyinfo).isSetState == STATE_TURE)
{
//如果是设置状态
switch((*keyinfo).curPage)
{
case powerVolPage:
//电源电压设置
break;
case setVolPage1:
{
//修改整数值
(*keyinfo).setVol = (*keyinfo).setVol - 1;
if((*keyinfo).setVol <= 1.5f){
(*keyinfo).setVol = 1.5f;
}
(*keyinfo).dacout = ((*keyinfo).setVol-1.221f)/4.0f; //计算实际输出多少v电压
(*keyinfo).dacout = (4096 * (*keyinfo).dacout)/3.3f; //转换为数字量进行设置
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (*keyinfo).dacout);
}
break;
case setVolPage2:
{
//修改小数值
(*keyinfo).setVol = (*keyinfo).setVol - 0.1f;
if((*keyinfo).setVol <= 1.5f){
(*keyinfo).setVol = 1.5f;
}
(*keyinfo).dacout = ((*keyinfo).setVol-1.221f)/4.0f; //计算实际输出多少v电压
(*keyinfo).dacout = (4096 * (*keyinfo).dacout)/3.3f; //转换为数字量进行设置
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (*keyinfo).dacout);
}
break;
case ProtectCurPage:
{
(*keyinfo).ProtectCur = (*keyinfo).ProtectCur - 100;
if((*keyinfo).ProtectCur <= 100){
(*keyinfo).ProtectCur = 100;
}
}
break;
default:
break;
}
showCursor((*keyinfo).curPage,(*keyinfo).isOut,(*keyinfo).ProtectCur,(*keyinfo).setVol);
}
}
break;
case Key2LongPress:
break;
default:
break;
}
}
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
148
149
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
148
149
主函数处理
大部分初始化操作cubemx已经帮我们处理完成了,这里主要是对屏幕和定时器进行初始化,并且开启默认输出;在while循环中,考虑到有屏幕显示、有数据获取、有按键扫描,这些操作所需时间间隔是不一致的,如果单纯用一个延时不太合适,这里加入一个定时器,进行1ms计时,然后分配不同的时间,比如500ms刷新屏幕,10ms扫描按键等。
C
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t num = 0,i = 0; //计数值
uint8_t keyValue = KEY_ERROR; //按键值
float tempVol = 0,tempVolMax = 0,tempVolMin = 9999;//临时电压采集存放值,最大值,最小值
float filter[2][55]={0}; //滤波数组
double sum_volfilter = 0,sum_curfilter = 0; //滤波值
keyinfo.curPage = NoPage; //默认没有光标显示
keyinfo.isSetState = STATE_FALSE; //默认不进入设置状态
keyinfo.powerVol = In9V; //默认电源供电电压为9V
keyinfo.ProtectCur = 100; //默认阈值电流为100mA
keyinfo.setVol = 5.0f; //默认设置输出电压为1.8V
keyinfo.isOut = OPEN_VOL; //默认打开输出
/* 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();
MX_DMA_Init();
MX_SPI1_Init();
MX_TIM3_Init();
MX_ADC1_Init();
MX_DAC_Init();
/* USER CODE BEGIN 2 */
setInVol(keyinfo.powerVol);
TFT_Init(); //初始化屏幕
TFT_ShowStaticUI(keyinfo); //显示静态UI效果
HAL_TIM_Base_Start_IT(&htim3); //消息定时器开始计时
keyinfo.dacout = (keyinfo.setVol-1.221f)/4.0f; //计算实际输出多少v电压
keyinfo.dacout = (4096 * keyinfo.dacout)/3.3f; //转换为数字量进行设置
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, keyinfo.dacout);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
if(keyinfo.isOut == OPEN_VOL){
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET); //打开可调输出
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(showTimer >= 500)
{
//每500ms刷新一次数据
for(i=0;i<50;i++)
{
sum_volfilter = sum_volfilter + filter[0][i];
sum_curfilter= sum_curfilter + filter[1][i];
filter[0][i] = 0;
filter[1][i] = 0;
}
realtimedata.actualVol = sum_volfilter / 50.0f; //获取50次平均值电压
realtimedata.actualCur = sum_curfilter / 50.0f; //获取50次平均值电流
realtimedata.Vmax = tempVolMax; //获取峰值电压
realtimedata.Vmin = tempVolMin; //获取谷值电压
TFT_ShowUI(realtimedata); //更新显示
showTimer = 0; //恢复数据
sum_volfilter = 0;
sum_curfilter = 0;
tempVolMax = 0;
tempVolMin = 9999;
}
if(amendTimer >= 10)
{
//每隔10ms修正一次实际输出的电压值
tempVol = (adcValue[1] * 3.3f) / 4096.0f; //获取采集到的电压值
filter[0][num] = tempVol * 5; //转换为真实电压值
tempVol = 0;
tempVol = (adcValue[0] * 3.3f) / 4096.0f; //获取采集到的电压值
filter[1][num] = tempVol / 50.0f / 0.01f * 1000; //转换为真实电流值
tempVol = 0;
if(filter[0][num] < keyinfo.setVol) //如果电压值比设置电压值低,进行矫正,目前已经很准了,无需校准
{
//keyinfo.dacout+=1;
//HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, keyinfo.dacout);
}
else{
//keyinfo.dacout-=1;
//HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, keyinfo.dacout);
}
if(tempVolMin > filter[0][num])
{
tempVolMin = filter[0][num]; //获取最大值
}
if(tempVolMax < filter[0][num])
{
tempVolMax = filter[0][num]; //获取最小值
}
if(filter[1][num] > keyinfo.ProtectCur) //如果采集到电流值大于保护阈值
{
keyinfo.isOut = CLOSE_VOL;
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET); //关闭可调输出
TFT_ShowString(118,24,(uint8_t *)"Close",RED,BLACK,12,0);
}
memset(adcValue,0,sizeof(adcValue));
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adcValue,sizeof(adcValue)/sizeof(adcValue[0])); //重新开始adc采集
num++;
if(num >= 50){
num = 0; //防止数据溢出
}
amendTimer = 0;
}
if(keyTimer >= 10){
keyValue = key_scanf(); //每10ms扫描一次按键
keyTimer = 0;
}
if(keyValue != KEY_ERROR)
{
key_handle(keyValue,&keyinfo); //按键处理函数
keyValue = KEY_ERROR; //复原按键状态
}
}
/* 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
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
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
诱骗电压设置
这个较为简单,仅需要根据ch224k数据手册改变对应引脚电平即可
C
/*
函数内容:设置输入电压
函数参数:设置值
返回值:无
注意:需要根据自己充电器适配选择合适的诱骗电压,有些充电器是自有协议,部分电压可能会诱骗不出来
*/
void setInVol(uint8_t value)
{
switch(value)
{
case In9V:
{
//0-0-0:CFG1-CFG2-CFG3
HAL_GPIO_WritePin(CFG1_GPIO_Port, CFG1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, CFG3_Pin|CFG2_Pin, GPIO_PIN_RESET);
}
break;
case In12V:
{
//0-0-1:CFG1-CFG2-CFG3
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);
}
break;
case In15V:
{
//0-1-1:CFG1-CFG2-CFG3
HAL_GPIO_WritePin(CFG1_GPIO_Port, CFG1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG2_GPIO_Port, CFG2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CFG3_GPIO_Port, CFG3_Pin, GPIO_PIN_SET);
}
break;
case In20V:
{
//0-1-0:CFG1-CFG2-CFG3
HAL_GPIO_WritePin(CFG1_GPIO_Port, CFG1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(CFG2_GPIO_Port, CFG2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CFG3_GPIO_Port, CFG3_Pin, GPIO_PIN_RESET);
}
break;
default:
break;
}
}
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
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