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
|
/**
*
* Author: Dylan Muller
* Copyright (c) 2025
* All rights reserved.
*
* - Commercial/IP use prohibited.
* - Attribution required.
* See License.txt
*
*/
#include "setup.h"
#include "driver/mcp3202.h"
#include "driver/mcp4725.h"
#include "module/gate.h"
#include "util.h"
#include "status.h"
#include <avr/interrupt.h>
#include <util/delay.h>
extern t_gate_status gate_status;
extern t_system_status system_status;
uint16_t gate_probe(
uint16_t target_amp,
uint16_t* probe_result
)
{
uint16_t probe_volt = 0x0;
uint16_t drain_amp = 0x0;
uint16_t gate_count = 0x0;
uint16_t drain_count = 0x0;
system_status.status = SYSTEM_STATUS_BUSY;
util_volt_to_count(GATE_PROBE_DRAIN, &drain_count);
util_volt_to_count(GATE_PROBE_START, &gate_count );
dac_write(MCP4725_ID_GATE_VOLT, gate_count, 0);
_delay_ms(TRANSACT_DELAY_MS);
dac_write(MCP4725_ID_DRAIN_VOLT, drain_count, 0);
_delay_ms(TRANSACT_DELAY_MS);
while((drain_amp < target_amp) && probe_volt < GATE_PROBE_LIMIT)
{
gate_count += GATE_PROBE_INC;
dac_write(MCP4725_ID_GATE_VOLT, gate_count, 0);
_delay_us(GATE_LOOP_DELAY_US);
drain_count = adc_read(MCP3202_ID_DRAIN_AMP, 0);
util_count_to_volt(drain_count, &drain_amp);
util_count_to_volt(gate_count, &probe_volt);
}
_delay_ms(TRANSACT_DELAY_MS);
drain_count = adc_read(MCP3202_ID_DRAIN_AMP, 0);
util_count_to_volt(drain_count, &drain_amp);
if(GATE_PA_POWER_DOWN)
{
_delay_ms(TRANSACT_DELAY_MS);
dac_write(MCP4725_ID_DRAIN_VOLT, 0, 0);
}
gate_status.q_amp = drain_amp;
gate_status.q_volt = probe_volt;
*probe_result = probe_volt;
system_status.status = SYSTEM_STATUS_IDLE;
return drain_amp;
}
|