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;
}
  |