blob: 07f84db77e25a4c1921c2972590d5e28bbb3d76e (
plain)
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
  | 
/**
 * 
 * Author: Dylan Muller
 * Copyright (c) 2025 
 * All rights reserved.
 * 
 * - Commercial/IP use prohibited.
 * - Attribution required.
 * See License.txt
 *
 */
#include "setup.h"
#include "peripheral/spi.h"
#include "driver/mcp3202.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void adc_init(void)
{
    MCP3202_DEV_0_DDR |= (1 << MCP3202_DEV_0_SS);
    MCP3202_DEV_1_DDR |= (1 << MCP3202_DEV_1_SS);
    MCP3202_DEV_0_PORT &= ~(1 << MCP3202_DEV_0_SS);
    MCP3202_DEV_1_PORT &= ~(1 << MCP3202_DEV_1_SS);
    _delay_ms(TRANSACT_DELAY_MS);
    MCP3202_DEV_0_PORT |= (1 << MCP3202_DEV_0_SS);
    MCP3202_DEV_1_PORT |= (1 << MCP3202_DEV_1_SS);
    _delay_ms(TRANSACT_DELAY_MS);
}
uint16_t adc_read(
    uint8_t id,
    uint8_t conv_bypass
)
{
    uint8_t dev_id = 0x0;
    uint8_t dev_ch = 0x0;
    uint8_t dev_ss = 0x0;
    uint8_t* dev_port = 0x0;
    uint8_t cmd_buf[3] = {0x0, 0x0, 0x0};
    uint16_t adc_daq = 0x0;
    switch(id)
    {
        case MCP3202_ID_FW_POWER:
            dev_id = MCP3202_DEV_FW_POWER;
            dev_ch = MCP3202_CHN_FW_POWER;
            break;
        
        case MCP3202_ID_REV_POWER:
            dev_id = MCP3202_DEV_REV_POWER;
            dev_ch = MCP3202_CHN_REV_POWER;
            break;
        case MCP3202_ID_DRAIN_VOLT:
            dev_id = MCP3202_DEV_DRAIN_VOLT;
            dev_ch = MCP3202_CHN_DRAIN_VOLT;
            break;
        case MCP3202_ID_DRAIN_AMP:
            dev_id = MCP3202_DEV_DRAIN_AMP;
            dev_ch = MCP3202_CHN_DRAIN_AMP;
            break;
    }
    switch(dev_id)
    {
        case MCP3202_DEV_0:
            dev_port = (uint8_t*)&MCP3202_DEV_0_PORT;
            dev_ss = MCP3202_DEV_0_SS;
            break;
        
        case MCP3202_DEV_1:
            dev_port = (uint8_t*)&MCP3202_DEV_1_PORT;
            dev_ss = MCP3202_DEV_1_SS;
            break;
    }
    cmd_buf[0] = MCP3202_REQ_START;
    cmd_buf[1] = (dev_ch == MCP3202_CHN_0) ? MCP3202_REQ_CH0 : MCP3202_REQ_CH1;
    cmd_buf[2] = MCP3202_REQ_PAD;
    spi_start(cmd_buf, cmd_buf, sizeof(cmd_buf), dev_port, dev_ss);
    spi_flush();
    adc_daq = (uint16_t)(cmd_buf[MCP3202_DAQ_MSB]);
    adc_daq |= ((uint16_t)(cmd_buf[MCP3202_DAQ_LSB] & 0xF) << 8);
    adc_daq = adc_daq & 0xFFF;
    if (conv_bypass == 0)
    {
        switch(id)
        {
            case MCP3202_ID_DRAIN_VOLT:
                adc_daq = (uint32_t)(((uint32_t)adc_daq * MCP3202_DRAIN_VOLT_GAIN)/10);
                break;
            case MCP3202_ID_DRAIN_AMP:
                adc_daq = (uint32_t)(((uint32_t)adc_daq * 10)/MCP3202_DRAIN_AMP_GAIN);
                break;
        }
    }
        
    return (uint16_t)adc_daq;
}
uint16_t adc_read_n(
    uint8_t id,
    uint8_t n
)
{
    uint32_t x = 0;
    uint8_t i = 0;
    for (i = 0; i < n; i++)
    {
        x += adc_read(id, 0);
    }
    x /= n;
    return (uint16_t)x;
}
  |