Update BPM.c
This commit is contained in:
parent
2431677fd6
commit
d48f4542b5
104
BPM.c
104
BPM.c
|
@ -1,9 +1,105 @@
|
|||
#include <stdint.h>
|
||||
#include "tm4c123gh6pm.h"
|
||||
|
||||
// Function prototypes
|
||||
void Timer0A_Init(void);
|
||||
void ADC0_Init(void);
|
||||
void ADC0_Start(void);
|
||||
|
||||
|
||||
/**
|
||||
* main.c
|
||||
*/
|
||||
uint32_t ADC0_Read(void);
|
||||
void Delay(uint32_t time);
|
||||
|
||||
volatile uint32_t pulse_count = 0;
|
||||
volatile uint32_t pulse_detected = 0;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return 0;
|
||||
Timer0A_Init(); // Initialize Timer0A for 1-minute interval
|
||||
ADC0_Init(); // Initialize ADC0
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (pulse_detected)
|
||||
{
|
||||
pulse_count++; // Increment pulse count
|
||||
pulse_detected = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Timer0A Initialization: Configures Timer0A to generate an interrupt every 1 minute
|
||||
void Timer0A_Init(void)
|
||||
{
|
||||
SYSCTL_RCGCTIMER_R |= 0x01; // Enable clock to Timer0
|
||||
TIMER0_CTL_R = 0; // Disable Timer0A during configuration
|
||||
TIMER0_CFG_R = 0; // Set 32-bit timer configuration
|
||||
TIMER0_TAMR_R = 0x02; // Configure Timer0A in periodic mode
|
||||
TIMER0_TAILR_R = 48000000 * 60; // Load value for 1-minute interval
|
||||
TIMER0_IMR_R |= 0x01; // Enable Timer0A timeout interrupt
|
||||
TIMER0_CTL_R |= 0x01; // Enable Timer0A
|
||||
NVIC_EN0_R |= (1 << 19); // Enable IRQ19 for Timer0A
|
||||
}
|
||||
|
||||
// ADC0 Initialization: Configures ADC0 for single-channel, single-conversion
|
||||
void ADC0_Init(void)
|
||||
{
|
||||
SYSCTL_RCGCADC_R |= 0x01; // Enable ADC0
|
||||
SYSCTL_RCGCGPIO_R |= 0x10; // Enable clock for Port E
|
||||
GPIO_PORTE_AFSEL_R |= 0x08; // Enable alternate function for PE3
|
||||
GPIO_PORTE_DEN_R &= ~0x08; // Disable digital I/O on PE3
|
||||
GPIO_PORTE_AMSEL_R |= 0x08; // Enable analog function on PE3
|
||||
ADC0_ACTSS_R &= ~0x08; // Disable SS3 during configuration
|
||||
ADC0_EMUX_R &= ~0xF000; // Configure SS3 for software trigger
|
||||
ADC0_SSMUX3_R = 0; // Set channel AIN0 (PE3)
|
||||
ADC0_SSCTL3_R = 0x06; // Set END0 and IE0 bits for single sample
|
||||
ADC0_ACTSS_R |= 0x08; // Enable SS3
|
||||
}
|
||||
|
||||
// Start ADC0 Conversion
|
||||
void ADC0_Start(void)
|
||||
{
|
||||
ADC0_PSSI_R |= 0x08; // Initiate SS3
|
||||
}
|
||||
|
||||
|
||||
// Read ADC0 Value
|
||||
uint32_t ADC0_Read(void)
|
||||
{
|
||||
while ((ADC0_RIS_R & 0x08) == 0); // Wait for conversion to complete
|
||||
uint32_t result = ADC0_SSFIFO3_R & 0xFFF; // Read 12-bit ADC result
|
||||
ADC0_ISC_R = 0x08; // Clear completion flag
|
||||
return result;
|
||||
}
|
||||
|
||||
// Timer0A Interrupt Handler: Executes every 1 minute
|
||||
void Timer0A_Handler(void)
|
||||
{
|
||||
TIMER0_ICR_R = 0x01; // Clear the timer interrupt flag
|
||||
pulse_count = 0; // Reset pulse count for the next interval
|
||||
}
|
||||
|
||||
// Sample ADC and check for pulse presence
|
||||
void check_pulse(void)
|
||||
{
|
||||
ADC0_Start();
|
||||
uint32_t adc_value = ADC0_Read();
|
||||
|
||||
// Convert ADC value to voltage (assuming 3.3V reference)
|
||||
float voltage = (adc_value * 3.3) / 4095;
|
||||
|
||||
if (voltage >= 0.4 && voltage <= 0.6)
|
||||
{
|
||||
pulse_detected = 1; // Signal a valid pulse
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Simple delay function
|
||||
void Delay(uint32_t time)
|
||||
{
|
||||
volatile uint32_t count;
|
||||
for(count = 0; count < time; count++);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue