-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathADC14.c
154 lines (124 loc) · 4.62 KB
/
ADC14.c
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
150
151
152
153
154
// ADC14.c
// Runs on MSP432
// ADC input, software trigger, 14-bit conversion,
// 2.5 V static (always on) reference
// Daniel Valvano
// June 11, 2015
// Modified
// LJBeato
// March 2021
#include <stdint.h>
#include "msp.h"
#include "Common.h"
#include "CortexM.h"
#include "ADC14.h"
//
//
// We are going to use Port 4 Pin 7 which is ADC A6
// P4.7 = A6
//
//
void ADC0_InitSWTriggerCh6(void)
{
// wait for reference to be idle
// REF_A->CTL0
while((REF_A->CTL0&0x400)){};
// set reference voltage to 2.5V
// 1) configure reference for static 2.5V
// REF_A->CTL0
REF_A->CTL0 = 0x0039;
// wait for reference voltage to be ready
// REF_A->CTL0
while((REF_A->CTL0&0x1000) == 0){};
// 2) ADC14ENC = 0 to allow programming
// ADC14->CTL0
ADC14->CTL0 &= ~BIT1;
// 3) wait for BUSY to be zero
// ADC14->CTL0
while(ADC14->CTL0&0x00010000){};
// ------------------------------------------------------------------
// 31-30 ADC14PDIV predivider, 00b = Predivide by 1
// 29-27 ADC14SHSx SHM source 000b = ADC14SC bit
// 26 ADC14SHP SHM pulse-mode 1b = SAMPCON the sampling timer
// 25 ADC14ISSH invert sample-and-hold 0b = not inverted
// 24-22 ADC14DIVx clock divider 000b = /1
// 21-19 ADC14SSELx clock source select 100b = SMCLK
// 18-17 ADC14CONSEQx mode select 00b = Single-channel, single-conversion
// 16 ADC14BUSY ADC14 busy 0b (read only)
// 15-12 ADC14SHT1x sample-and-hold time 0011b = 32 clocks (use 32 clocks)
// 11-8 ADC14SHT0x sample-and-hold time 0011b = 32 clocks (use 32 clocks)
// 7 ADC14MSC multiple sample 0b = not multiple
// 6-5 reserved 00b (reserved)
// 4 ADC14ON ADC14 on 1b = powered up
// 3-2 reserved 00b (reserved)
// 1 ADC14ENC enable conversion 0b = ADC14 disabled
// 0 ADC14SC ADC14 start 0b = No start (yet)
// ------------------------------------------------------------------
// 4) single, SMCLK, on, disabled, /1, 32 clocks, SHM pulse-mode
// ADC14->CTL0
ADC14->CTL0 = 0x4203310;
// 20-16 STARTADDx start addr 00000b = ADC14MEM0
// 15-6 reserved 0000000000b (reserved)
// --
// 5-4 ADC14RES ADC14 resolution 11b = 14 bit, 16 clocks
// --
// 3 ADC14DF data read-back format 0b = Binary unsigned
// 2 REFBURST reference buffer burst 0b = reference on continuously
// 1-0 ADC14PWRMD ADC power modes 00b = Regular power mode
//
// 5) ADC14MEM0, 14-bit, ref on, regular power
// ADC14->CTL1
ADC14->CTL1 = 0x30;
// ADC14->MCTL[0]
// VREF buffered
// End of sequence
// 00110b = If ADC14DIF = 0: A6;
// // 6) 0 to 2.5V, channel 6
ADC14->MCTL[0] = 0x00000186;
// 15 ADC14WINCTH Window comp threshold 0b = not used
// 14 ADC14WINC Comparator enable 0b = Comparator disabled
// 13 ADC14DIF Differential mode 0b = Single-ended mode enabled
// 12 reserved 0b (reserved)
// 11-8 ADC14VRSEL V(R+) and V(R-) 0001b = V(R+) = VREF, V(R-) = AVSS
// 7 ADC14EOS End of sequence 1b = End of sequence
// 6-5 reserved 00b (reserved)
// 4-0 ADC14INCHx Input channel 0110b = A6, P4.7
// 7) no interrupts
// ADC14->IER0
// ADC14->IER1
ADC14->IER0 = 0x0;
ADC14->IER1 = 0x0; // no interrupts
//
// P4.7 is Analog In A6
// 8) analog mode on A6, P4.7
// set pins for ADC A6
// SEL0, SEL1
P4->SEL0 |= BIT7;
P4->SEL1 |= BIT7;
// 9) enable
// ADC14->CTL0
ADC14->CTL0 |= BIT1;
}
// ADC14->IFGR0 bit 0 is set when conversion done
// cleared on read ADC14MEM0
// ADC14->CLRIFGR0 bit 0, write 1 to clear flag
// ADC14->IVx is 0x0C when ADC14MEM0 interrupt flag; Interrupt Flag: ADC14IFG0
// ADC14->MEM[0] 14-bit conversion in bits 13-0 (31-16 undefined, 15-14 zero)
unsigned int ADC_In(void)
{
unsigned int adcIn;
// 1) wait for BUSY to be zero ADC14->CTL0
// ADC14->CTL0
while(ADC14->CTL0&0x00010000){};
// 2) start single conversion
// ADC14->CTL0
ADC14->CTL0 |= BIT0;
// 3) wait for ADC14->IFGR0, ADC14->IFGR0 bit 0 is set when conversion done
// ADC14->IFGR0
while(!(ADC14->IFGR0&BIT0)){};
// 14 bit sample returned ADC14->MEM[0]
// ADC14->MEM[0] 14-bit conversion in bits 13-0 (31-16 undefined, 15-14 zero)
// ADC14->MEM[0]
adcIn = ADC14->MEM[0];
return adcIn; // 4) return result 0 to 16383
}