Untitled
unknown
plain_text
2 years ago
3.0 kB
32
Indexable
// Karl Alvene G. Hansol // EEE 158 - HUV // Lab 05 Activity 2 (Analog-to-digital Conversion (ADC)) #include <stdint.h> #include <stm32f4xx.h> #include <stm32f411xe.h> uint16_t adc_value = 0x0000; uint16_t temp_bit = 0x0000; uint16_t mask = 0x0000; uint16_t move = 0x0000; void GPIO_init(void); void ADC_init(void); void ADC_enable(void); void ADC_startconv(void); void ADC_waitconv(void); int ADC_GetVal(void); void TempSense(int); void delay_ms(int delay); int main(void) { GPIO_init(); ADC_init(); /* Loop forever */ while (1) { //start adc conversion ADC_enable(); //start conversion ADC_startconv(); //wait for conversion to finish ADC_waitconv(); //store converted data to a variable adc_value = ADC_GetVal(); //monitor temperature here TempSense(adc_value); } } void GPIO_init(void) { //enable GPIOA clock RCC->AHB1ENR |= (1 << 0); RCC->AHB1ENR |= (1 << 1); // Add this one //configure PA1 to analog mode GPIOA->MODER |= (1 << 3); GPIOA->MODER |= (1 << 2); //configure other GPIO pins here (Modify this code) GPIOB->MODER &= ~(1 << 3); GPIOB->MODER |= (1 << 2); GPIOB->MODER &= ~(1 << 5); GPIOB->MODER |= (1 << 4); GPIOB->OTYPER &= ~(1<<1); GPIOB->OTYPER &= ~(1<<2); } void ADC_init(void) { //enable adc clock RCC->APB2ENR |= (1 << 8); //prescaler = 2 ADC->CCR &= ~(1 << 16); ADC->CCR &= ~(1 << 17); //configure ADC resolution ADC1->CR1 &= ~(1 << 25); ADC1->CR1 &= ~(1 << 24); //Configure to Scan mode ADC1->CR1 |= (1 << 8); //Enable Interrupt for EOC ADC1->CR1 |= (1 << 5); //configure sampling time ADC1->SMPR2 &= ~(1 << 5); ADC1->SMPR2 &= ~(1 << 4); ADC1->SMPR2 |= (1 << 3); //end of conversion selection ADC1->CR2 &= ~(1 << 10); //configure data alignment ADC1->CR2 &= ~(1 << 11); //total number of conversions in the channel conversion sequence ADC1->SQR1 &= ~(1 << 23); ADC1->SQR1 &= ~(1 << 22); ADC1->SQR1 &= ~(1 << 21); ADC1->SQR1 &= ~(1 << 20); //assign channel for first conversion ADC1->SQR3 |= (1 << 0); //cont conversion mode ADC1->CR2 |= (1 << 1); } void ADC_enable(void) { ADC1->CR2 |= (1 << 0); //enable the adc delay_ms(1); // required to ensure adc stable } void ADC_startconv(void) { ADC1->CR2 |= (1 << 30); } void ADC_waitconv(void) { //wait for the end of conversion while (!((ADC1->SR) & (1 << 1))) { ; } } int ADC_GetVal(void) { return ADC1->DR; //read the value contained at the data register } void TempSense(int adc_value){ //do something useful here if (adc_value > 1800) { GPIOB->ODR &= ~(1 << 2); GPIOB->ODR |= (1 << 1); } else { GPIOB->ODR &= ~(1 << 1); GPIOB->ODR |= (1 << 2); } } void delay_ms(int delay) { int i; for (; delay > 0; delay--) { for (i = 0; i < 2657; i++) ; } } //PUT YOUR ANSWER TO THE QUESTION BELOW.. just make sure they are commented as well :)
Editor is loading...
Leave a Comment