-
Notifications
You must be signed in to change notification settings - Fork 0
/
ADC.c
88 lines (76 loc) · 3.45 KB
/
ADC.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
#include "main.h"
#include "stm32f4xx_adc.h"
void leds_init() {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &gpio);
}
void adc_init() {
ADC_InitTypeDef ADC_init_structure; //Structure for adc confguration
GPIO_InitTypeDef GPIO_initStructre; //Structure for analog input pin
//Clock configuration
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //The ADC1 is connected the APB2 peripheral bus thus we will use its clock source
RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN, ENABLE); //Clock for the ADC port!! Do not forget about this one ;)
//Analog pin configuration
GPIO_StructInit(&GPIO_initStructre);
GPIO_initStructre.GPIO_Pin = GPIO_Pin_0; //The channel 10 is connected to PC0
GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PC0 pin is configured in analog mode
GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down
GPIO_Init(GPIOC, &GPIO_initStructre); //Affecting the port with the initialization structure configuration
//ADC structure configuration
ADC_DeInit();
ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right; //data converted will be shifted to right
ADC_init_structure.ADC_Resolution = ADC_Resolution_12b; //Input voltage is converted into a 12bit number giving a maximum value of 4096
ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //the conversion is continuous, the input data is converted more than once
ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // conversion is synchronous with TIM1 and CC1 (actually I'm not sure about this one :/)
ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //no trigger for conversion
ADC_init_structure.ADC_NbrOfConversion = 1; //I think this one is clear :p
ADC_init_structure.ADC_ScanConvMode = DISABLE; //The scan is configured in one channel
ADC_Init(ADC1, &ADC_init_structure); //Initialize ADC with the previous configuration
//Enable ADC conversion
ADC_Cmd(ADC1, ENABLE);
//Select the channel to be read from
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_144Cycles);
}
void Delay(unsigned int Val) {
for (; Val != 0; Val--)
__NOP();
}
u16 readADC1(u8 channel) {
ADC_SoftwareStartConv(ADC1);//Start the conversion
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion
return ADC_GetConversionValue(ADC1); //Return the converted data
}
int main() {
leds_init();
// инициализируем диоды
adc_init();
// ацп
//ADC_TempSensorVrefintCmd(ENABLE);
// разрешаем преобразование
do {
unsigned int Temperature = readADC1(16);
// читаем данные с датчика АЦП1
if (Temperature > 1000) {
// если больше 20 зажигаем первый диод
GPIO_SetBits(GPIOD, GPIO_Pin_12);
}
if (Temperature > 2000) { // если больше 30 - второй. и т.д.
GPIO_SetBits(GPIOD, GPIO_Pin_13);
}
if (Temperature > 3000) {
GPIO_SetBits(GPIOD, GPIO_Pin_14);
}
if (Temperature > 4000) {
GPIO_SetBits(GPIOD, GPIO_Pin_15);
}
Delay(5000000);
GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
Delay(5000000);
// задержка
} while (1);
}