Triển khai các mô-đun phần mềm cho trình điều khiển

Một phần của tài liệu Thiết kế và phát triển mô đun phát hiện tia phóng xạ phục vụ công tác giám sát an toàn bức xạ trong bệnh viện (Trang 62 - 69)

CHƯƠNG 3. THIẾT KẾ HỆ THỐNG

3.12 Xây dựng phần mềm điều khiển mạch trung tâm

3.12.7 Triển khai các mô-đun phần mềm cho trình điều khiển

Dựa trên các kết quả thu nhận được từ các phân tích, thiết kế và thuật toán điều khiển đã xây dựng, nhóm nghiên cứu triển khai thực tế trình điều khiển cho mạch điều khiển trung tâm, kết nối và điều khiển phối hợp các mô-đun thành phần.

49 a) Khởi tạo bộ định thời Timer0 và hàm gọi ngắt

void Init_1Hz_SamplingTimer0(void) {

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);

uint32_t ui32Period = SysCtlClockGet()/2;

ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period -1);

ROM_IntEnable(INT_TIMER0A);

ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

}

void Timer0AIntHandler(void)

ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

Timer0_counter++;

}

b) Khởi tạo bộ định thời Timer4 và hàm gọi ngắt

void Init_1Hz_Timer4(void) {

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4);

ROM_TimerConfigure(TIMER4_BASE, TIMER_CFG_PERIODIC);

uint32_t ui32Period = SysCtlClockGet()/1;

ROM_IntEnable(INT_TIMER4A);

ROM_TimerEnable(TIMER4_BASE, TIMER_A);

}

void Timer4AIntHandler(void) {

ROM_TimerIntClear(TIMER4_BASE, TIMER_TIMA_TIMEOUT);

if(key_active == true) Timer4_counter++;

}

c) Khởi tạo bộ định thời Timer5 và hàm gọi ngắt

void Init_10Hz_Timer5(void) {

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER5);

ROM_TimerConfigure(TIMER5_BASE, TIMER_CFG_PERIODIC);

uint32_t ui32Period = SysCtlClockGet()/200;

ROM_TimerLoadSet(TIMER5_BASE, TIMER_A, ui32Period -1);

ROM_IntEnable(INT_TIMER5A);

ROM_TimerIntEnable(TIMER5_BASE, TIMER_TIMA_TIMEOUT);

}

void Timer5AIntHandler(void) {

50

ROM_TimerIntClear(TIMER5_BASE, TIMER_TIMA_TIMEOUT);

Timer5_counter++;

PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6, (uint32_t)Timer5_counter);

if(Timer5_counter >= Dimmer_Time) {

ROM_TimerDisable(TIMER5_BASE, TIMER_A);

} }

d) Mô-đun phần mềm khối điều khiển độ sáng màn hình, PWM6

void M1PWM7_Init(void) {

ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_1);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

ROM_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_3);

ROM_GPIOPinConfigure(GPIO_PF3_M1PWM7);

PWMGenConfigure(PWM1_BASE, PWM_GEN_3, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

float fPWM = 80000000 / 250000.0;

PWMGenPeriodSet(PWM1_BASE, PWM_GEN_3, (uint32_t)fPWM);

float pulse_width = 125 / 12.5;

PWMPulseWidthSet(PWM1_BASE,PWM_OUT_7,(uint32_t)pulse_width);

PWMOutputState(PWM1_BASE, PWM_OUT_7_BIT, true);

PWMGenEnable(PWM1_BASE, PWM_GEN_3);

}

e) Thực thi khi không có sự tương tác từ người dùng

void Timer5AIntHandler(void) {

ROM_TimerIntClear(TIMER5_BASE, TIMER_TIMA_TIMEOUT);

Timer5_counter++;

PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6, (uint32_t)Timer5_counter);

if(Timer5_counter >= Dimmer_Time) {

ROM_TimerDisable(TIMER5_BASE, TIMER_A);

} }

f) Khai báo các chân điều khiển màn cảm ứng

#define TS_XP_PERIPH SYSCTL_PERIPH_GPIOD

#define TS_XP_BASE GPIO_PORTD_BASE

#define TS_XP_PIN GPIO_PIN_1

#define TS_XP_ADC ADC_CTL_CH6

#define TS_XN_PERIPH SYSCTL_PERIPH_GPIOD

51

#define TS_XN_BASE GPIO_PORTD_BASE

#define TS_XN_PIN GPIO_PIN_6

#define TS_YP_PERIPH SYSCTL_PERIPH_GPIOD

#define TS_YP_BASE GPIO_PORTD_BASE

#define TS_YP_PIN GPIO_PIN_3

#define TS_YP_ADC ADC_CTL_CH4

#define TS_YN_PERIPH SYSCTL_PERIPH_GPIOD

#define TS_YN_BASE GPIO_PORTD_BASE

#define TS_YN_PIN GPIO_PIN_2

g) Khai báo các bước trong một lần tính toán tọa độ X, Y trên cảm ứng

static uint32_t g_ui32TSState;

#define TS_STATE_INIT 0

#define TS_STATE_SKIP_X 1

#define TS_STATE_READ_X 2

#define TS_STATE_SKIP_Y 3

#define TS_STATE_READ_Y 4

h) Khai báo ngưỡng lực khi nhấn vào màn cảm ứng

#define TOUCH_MIN 150

i) Thủ tục khởi tạo màn cảm ứng

void TouchScreenInit() {

g_ui32TSState = TS_STATE_INIT;

g_pfnTSHandler = 0;

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);

ROM_SysCtlPeripheralEnable(TS_XP_PERIPH);

ROM_SysCtlPeripheralEnable(TS_YP_PERIPH);

ROM_SysCtlPeripheralEnable(TS_XN_PERIPH);

ROM_SysCtlPeripheralEnable(TS_YN_PERIPH);

ROM_GPIOPinTypeGPIOInput(TS_XP_BASE, TS_XP_PIN);

ROM_GPIOPinTypeGPIOInput(TS_YP_BASE, TS_YP_PIN);

ROM_GPIOPinTypeGPIOInput(TS_XN_BASE, TS_XN_PIN);

ROM_GPIOPinTypeGPIOInput(TS_YN_BASE, TS_YN_PIN);

ROM_GPIOPinTypeGPIOOutput(TS_XP_BASE, TS_XP_PIN);

ROM_GPIOPinWrite(TS_XP_BASE, TS_XP_PIN, 0);

ROM_GPIOPinTypeGPIOOutput(TS_YP_BASE, TS_YP_PIN);

ROM_GPIOPinWrite(TS_YP_BASE, TS_YP_PIN, 0);

ROM_GPIOPinTypeGPIOOutput(TS_XN_BASE, TS_XN_PIN);

ROM_GPIOPinWrite(TS_XN_BASE, TS_XN_PIN, 0);

ROM_GPIOPinTypeGPIOOutput(TS_YN_BASE, TS_YN_PIN);

ROM_GPIOPinWrite(TS_YN_BASE, TS_YN_PIN, 0);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);

ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 4);

ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 0);

52

ROM_ADCSequenceStepConfigure(ADC0_BASE, 3, 0, TS_YP_ADC | ADC_CTL_END | ADC_CTL_IE);

ROM_ADCSequenceEnable(ADC0_BASE, 3);

ROM_ADCIntEnable(ADC0_BASE, 3);

ROM_IntEnable(INT_ADC0SS3);

if((HWREG(TIMER1_BASE + TIMER_O_CTL) & TIMER_CTL_TAEN) == 0) {

ROM_TimerConfigure(TIMER1_BASE, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | TIMER_CFG_B_PERIODIC));

ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, (SysCtlClockGet() / 1000) - 1);

ROM_TimerControlTrigger(TIMER1_BASE, TIMER_A, true);

ROM_TimerEnable(TIMER1_BASE, TIMER_A);

} }

j) Vòng lặp đọc giá trị tọa độ X, Y và so sánh với ngưỡng

void TouchScreenIntHandler(void) {

HWREG(ADC0_BASE + ADC_O_ISC) = ADC_ISC_IN3;

switch(g_ui32TSState) {

case TS_STATE_SKIP_X:

{

HWREG(ADC0_BASE + ADC_O_SSFIFO3);

HWREG(TS_YP_BASE + GPIO_O_AMSEL) |= TS_YP_PIN;

HWREG(TS_YP_BASE + GPIO_O_DIR) &= ~TS_YP_PIN;

HWREG(TS_YN_BASE + GPIO_O_DIR) &= ~TS_YN_PIN;

g_ui32TSState = TS_STATE_READ_X;

break;

}

case TS_STATE_READ_X:

{

g_i16TouchX = HWREG(ADC0_BASE + ADC_O_SSFIFO3);

HWREG(TS_YP_BASE + GPIO_O_AMSEL) &= ~TS_YP_PIN;

HWREG(TS_XP_BASE + GPIO_O_DIR) |= TS_XP_PIN;

HWREG(TS_XN_BASE + GPIO_O_DIR) |= TS_XN_PIN;

HWREG(TS_YP_BASE + GPIO_O_DIR) |= TS_YP_PIN;

HWREG(TS_YN_BASE + GPIO_O_DIR) |= TS_YN_PIN;

HWREG(TS_XP_BASE + GPIO_O_DATA + (TS_XP_PIN << 2)) = 0;

HWREG(TS_XN_BASE + GPIO_O_DATA + (TS_XN_PIN << 2)) = 0;

53

HWREG(TS_YP_BASE + GPIO_O_DATA + (TS_YP_PIN << 2)) = TS_YP_PIN;

HWREG(TS_YN_BASE + GPIO_O_DATA + (TS_YN_PIN << 2)) = 0;

HWREG(ADC0_BASE + ADC_O_SSMUX3) = TS_XP_ADC;

g_ui32TSState = TS_STATE_SKIP_Y;

break;

}

case TS_STATE_SKIP_Y:

{

HWREG(ADC0_BASE + ADC_O_SSFIFO3);

HWREG(TS_XP_BASE + GPIO_O_AMSEL) |= TS_XP_PIN;

HWREG(TS_XP_BASE + GPIO_O_DIR) &= ~TS_XP_PIN;

HWREG(TS_XN_BASE + GPIO_O_DIR) &= ~TS_XN_PIN;

g_ui32TSState = TS_STATE_READ_Y;

break;

}

case TS_STATE_READ_Y:

{

g_i16TouchY = HWREG(ADC0_BASE + ADC_O_SSFIFO3);

}

case TS_STATE_INIT:

{

HWREG(TS_XP_BASE + GPIO_O_AMSEL) &= ~TS_XP_PIN;

HWREG(TS_XP_BASE + GPIO_O_DIR) |= TS_XP_PIN;

HWREG(TS_XN_BASE + GPIO_O_DIR) |= TS_XN_PIN;

HWREG(TS_YP_BASE + GPIO_O_DIR) |= TS_YP_PIN;

HWREG(TS_YN_BASE + GPIO_O_DIR) |= TS_YN_PIN;

HWREG(TS_XP_BASE + GPIO_O_DATA + (TS_XP_PIN << 2)) = TS_XP_PIN;

HWREG(TS_XN_BASE + GPIO_O_DATA + (TS_XN_PIN << 2)) = 0;

HWREG(TS_YP_BASE + GPIO_O_DATA + (TS_YP_PIN << 2)) = 0;

HWREG(TS_YN_BASE + GPIO_O_DATA + (TS_YN_PIN << 2)) = 0;

HWREG(ADC0_BASE + ADC_O_SSMUX3) = TS_YP_ADC;

if(g_ui32TSState == TS_STATE_READ_Y) {

TouchScreenDebouncer();

}

g_ui32TSState = TS_STATE_SKIP_X;

54

break;

} } }

55

Một phần của tài liệu Thiết kế và phát triển mô đun phát hiện tia phóng xạ phục vụ công tác giám sát an toàn bức xạ trong bệnh viện (Trang 62 - 69)

Tải bản đầy đủ (PDF)

(75 trang)