📄 adc.lst
字号:
ANSI-C/cC++ Compiler for ST7 V-5.0.7, Aug 21 2001
1: /**************** (c) 2004 STMicroelectronics **********************
2:
3: PROJECT : ST7MC demokit
4: COMPILER : ST7 METROWERKS C (HIWARE) / COSMIC
5:
6: MODULE : adc.c
7: VERSION : 1.2
8:
9: CREATION DATE : 08.2003
10: AUTHOR : Florent COSTE / Microcontroller Application Lab / ST Hong Kong
11:
12: -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
13:
14: DESCRIPTION : ADC routines
15: -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
16:
17: 01.2004 (V. Onde) Rel 1.1: Add ADC_Init(), u8 GetHeatsinkTemp(), u8 GetBusVoltage()
18: 03.2004 (V. Onde) Rel 1.2: Use HW registers and bit definitions of ST7FMC2N6.h
19:
20: ******************************************************************************
21: THE SOFTWARE INCLUDED IN THIS FILE IS FOR GUIDANCE ONLY. ST MICROELECTRONICS
22: SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES
23: WITH RESPECT TO ANY CLAIMS ARISING FROM USE OF THIS SOFTWARE.
24: ******************************************************************************
25:
26: ******************************************************************************/
27:
28: // Standard types definitions and ST7 specific macros
29: #include "lib.h"
30: // Public ADC peripheral function prototypes
31: #include "adc.h"
32: // ST7FMC peripherals Hardware Registers declaration
33: #include "ST7FMC2N6.h"
34:
35: /* Private Constants --------------------------------------------------------*/
36:
37: // Heatsink Temperature monitoring
38: #define TEMP_SENSOR_CHANNEL CONVERT_AIN0 /* Select here ADC channel for temperature sensor*/
39:
40: // Protection set-up for ST7MC starter kit RevC; cf schematics for part numbers and values
41: #define NTC_THRESHOLD 110 /* Maximum allowed temperature for heatsink: 110癈 on IGBT package */
42: #define NTC_HYSTERESIS 8 /* Temperature gap before re-enabling inverter */
43:
44: #define OVER_TEMPERATURE ((u8)0x01) /* Private flag to store inverter state */
45:
46: // Inverter Bus voltage monitoring
47: #define BUS_VOLTAGE_CHANNEL CONVERT_AIN1 /* Select here ADC channel for bus voltage reading */
48:
49: // Protection set-up for ST7MC starter kit RevC; cf schematics for part numbers and values
50: /* Maximum allowed voltage for Bulk capacitors and/or power switches is around 275Vrms on AC input*/
51: #define HVBUS_THRESHOLD 1020
52: #define HVBUS_HYSTERESIS 19 /* Voltage gap before re-enabling inverter */
53:
54: #define OVER_VOLTAGE ((u8)0x02)
55:
56: /* ADC peripheral bits and bitfields definitions missing in ST7FMC2N6.h -----*/
57: #define PRSC_MASK ((u8)0x00) /* Define here selected prescaler ratio */
58: #define CS3_MSK ((u8)0x08) /* ADC Channel selection Mask */
59: #define CS2_MSK ((u8)0x04) /* ADC Channel selection Mask */
60: #define CS1_MSK ((u8)0x02) /* ADC Channel selection Mask */
61: #define CS0_MSK ((u8)0x01) /* ADC Channel selection Mask */
62:
63: #define CONVERT_AIN0 ((u8)ADCCSR_ADON_OR + PRSC_MASK )
64: #define CONVERT_AIN1 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS0_MSK )
65: #define CONVERT_AIN2 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS1_MSK )
66: #define CONVERT_AIN3 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS1_MSK + CS0_MSK )
67: #define CONVERT_AIN4 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS2_MSK )
68: #define CONVERT_AIN5 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS2_MSK + CS0_MSK )
69: #define CONVERT_AIN6 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS2_MSK + CS1_MSK )
70: #define CONVERT_AIN7 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS2_MSK + CS1_MSK + CS0_MSK )
71: #define CONVERT_AIN8 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK )
72: #define CONVERT_AIN9 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS0_MSK )
73: #define CONVERT_AIN10 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS1_MSK )
74: #define CONVERT_AIN11 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS1_MSK + CS0_MSK )
75: #define CONVERT_AIN12 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS2_MSK )
76: #define CONVERT_AIN13 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS2_MSK + CS0_MSK )
77: #define CONVERT_AIN14 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS2_MSK + CS1_MSK )
78: #define CONVERT_AIN15 ((u8)ADCCSR_ADON_OR + PRSC_MASK + CS3_MSK + CS2_MSK + CS1_MSK + CS0_MSK )
79:
80: /* Private Functions prototypes -------------------------------------------- */
81: static u16 ADC_Get_10bits(u8); // returns 10 bits result (full ADC resolution)
82: static u8 ADC_Get_8bits(u8); // returns 8 bits result only
83:
84: /* Private Variables ------------------------------------------------------- */
85: static u8 InverterStatus; // Stores current inverter state
86:
87: /*-----------------------------------------------------------------------------
88: ROUTINE Name : ADC_Init
89:
90: Description: Start-up and initialize the ADC. Clear flags related to inverter
91: monitoring
92: Input/Output: None
93: Comments: None
94: -----------------------------------------------------------------------------*/
95: void ADC_Init(void)
96: {
Function: ADC_Init
Source : ..\..\source\adc.c
Options : -Cc -F7 -Lasm=%n.lst -Ml -N -Os -Ou -Of -Ol0 -OnPMNC -Or
97: // Switch ON the ADC at max speed (4MHz with 8MHz CPU clock)
98: // Heatsink temperature selected by default
99: ADCCSR = TEMP_SENSOR_CHANNEL;
0000 a610 LD A,#16
0002 b700 LD ADCCSR,A
100:
101: InverterStatus = 0;
0004 4f CLR A
0005 c70000 LD InverterStatus,A
102: }
0008 81 RET
103:
104:
105: /*-----------------------------------------------------------------------------
106: ROUTINE Name : ADC_Get_10bits
107:
108: Description: Return the full ADC resolution value (10 bits).
109: Input/Output: u8/u16 (channel number/result of conversion)
110: Comments: None
111: -----------------------------------------------------------------------------*/
112: u16 ADC_Get_10bits(u8 Channel)
113: {
Function: ADC_Get_10bits
Source : ..\..\source\adc.c
Options : -Cc -F7 -Lasm=%n.lst -Ml -N -Os -Ou -Of -Ol0 -OnPMNC -Or
114: u16 result = 0;
0000 3f01 CLR result:1
0002 3f00 CLR result
115: u8 i;
116:
117: ADCCSR = Channel; // 4 Mhz sampling, ADC on
0004 b700 LD ADCCSR,A
118:
119: while (!ValBit(ADCCSR,ADCCSR_EOC)); // wait till end of conversion
0006 0f00fd BTJF ADCCSR,#7,*0 ;abs = 0006
120: ADCDRH; // and ignore 1st result
0009 b600 LD A,ADCDRH
121:
122: for (i=0;i<=7;i++) // take 8 samples
000b 3f00 CLR i
123: {
124: while (!ValBit(ADCCSR,ADCCSR_EOC)); // wait till end of conversion
000d 0f00fd BTJF ADCCSR,#7,*0 ;abs = 000d
125: result += ADCDRL;
0010 b600 LD A,ADCDRL
0012 bb01 ADD A,result:1
0014 b701 LD result:1,A
0016 4f CLR A
0017 b900 ADC A,result
0019 b700 LD result,A
126: result += (u16)(ADCDRH << 2); // clear EOC bit
001b be00 LD X,ADCDRH
001d 9f LD A,X
001e 5f CLR X
001f 48 SLL A
0020 59 RLC X
0021 48 SLL A
0022 59 RLC X
0023 bb01 ADD A,result:1
0025 b701 LD result:1,A
0027 9f LD A,X
0028 b900 ADC A,result
002a b700 LD result,A
002c 3c00 INC i
002e b600 LD A,i
0030 a107 CP A,#7
0032 23d9 JRULE *-37 ;abs = 000d
127: }
128:
129: result = result >> 3; // div/8 -> smooth result
0034 3400 SRL result
0036 3601 RRC result:1
0038 3400 SRL result
003a 3601 RRC result:1
003c 3400 SRL result
003e 3601 RRC result:1
130: return (result);
0040 b601 LD A,result:1
0042 be00 LD X,result
131: }
0044 81 RET
132:
133:
134:
135: /*-----------------------------------------------------------------------------
136: ROUTINE Name : ADC_Get_8bits
137:
138: Description: Return 8 bits resolution ADC value only.
139: Input/Output: u8/u8 (channel number/result of conversion)
140: Comments: None
141: -----------------------------------------------------------------------------*/
142: u8 ADC_Get_8bits(u8 Channel)
143: {
Function: ADC_Get_8bits
Source : ..\..\source\adc.c
Options : -Cc -F7 -Lasm=%n.lst -Ml -N -Os -Ou -Of -Ol0 -OnPMNC -Or
144: u16 result = 0;
0000 3f01 CLR result:1
0002 3f00 CLR result
145: u8 i;
146:
147: ADCCSR = Channel; // 4 Mhz sampling, ADC on
0004 b700 LD ADCCSR,A
148:
149: while (!ValBit(ADCCSR,ADCCSR_EOC)); // wait till end of conversion
0006 0f00fd BTJF ADCCSR,#7,*0 ;abs = 0006
150: ADCDRH; // and ignore 1st result
0009 b600 LD A,ADCDRH
151:
152: for (i=0;i<=7;i++) // take 8 samples
000b 3f00 CLR i
153: {
154: while (!ValBit(ADCCSR,ADCCSR_EOC)); // wait till end of conversion
000d 0f00fd BTJF ADCCSR,#7,*0 ;abs = 000d
155: result += ADCDRH; // clear EOC bit
0010 b600 LD A,ADCDRH
0012 bb01 ADD A,result:1
0014 b701 LD result:1,A
0016 4f CLR A
0017 b900 ADC A,result
0019 b700 LD result,A
001b 3c00 INC i
001d b600 LD A,i
001f a107 CP A,#7
0021 23ea JRULE *-20 ;abs = 000d
156: }
157:
158: result = result >> 3; // div/8 -> smooth result
0023 3400 SRL result
0025 3601 RRC result:1
0027 3400 SRL result
0029 3601 RRC result:1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -