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