system: [SYSTEM]

user: 4. 控制系统设计 4.1. 主控板控制程序 本系统以MSP430F5529LP作为控制核心控制器，实现对各个硬件功能模块之间的统筹调度。 如图6主程序流程图所示，整个控制系统的主程序以死循环的形式体现，保证系统能够在通电的情况下持续运行。 本系统的代码实现主要依靠寄存器的操作以及少量的库函数操作。系统在进行语音交互的过程中，对实时性的要求是很高的，如果在代码实现的部分中使用的大量的库函数进行操作会造成大量的冗余代码，使得系统对用户语音指令响应的时间过长。虽然使用在程序中使用大量的寄存器操作会使得程序的可读性以及可维护性差，但寄存器操作带来的实时性变强正是本系统所需要的。 4.2. 中断服务程序 本系统的控制程序中使用了四个中断，分别是MSP430F5529LP的串口中断0和1，外部中断0和1，如图7中断服务程序流程图所示。 图6. 主程序流程图 图7. 中断服务程序流程图 单片机中串口0主要用来与语音识别模块进行控制指令与返回值的交互，当单片机通过P3.3引脚(串口0的发送引脚)发送识别指令至语音识别模块时，语音识别模块开始识别用户的语音命令，在对音频经过采样，量化，编码后将识别结果通过P3.4引脚(串口0的接收引脚)返回至单片机内，此时单片机内触发串口中断0，然后对从串口接收的数据进行处理。 单片机中串口1主要是在单片机连接电脑时供调试使用，在电脑端可以通过串口调试助手连接单片机，并通过P4.4引脚(串口1的发送引脚)发送控制指令，此时触发单片机中的串口中断1，在对数据进行处理后通过P4.5引脚(串口1的接收引脚)返回处理后的结果，在串口调试助手中即可看见。 在MSP430F5529LP上，厂商定义了两个用户自定义按键KET1()和KEY2()，在本系统中，KEY1主要用来向语音识别模块发送开始识别指令，KEY2主要用来向语音识别模块发送退出识别指令，当KEY1按键按下时，触发外部中断0，向语音识别模块发送开始识别指令，当KEY2按键按下时，触发外部中断1，向语音识别模块发送退出识别指令。 4.3. 时钟配置 本系统在进行设计的过程中，考虑设置三种时钟频率，分别是32.768KHZ、1.1MHZ、16MHZ。 LFXT1是MSP430F5529LP提供的外部低频震荡源，频率为32.768KHZ，使用该震荡源的频率作为系统的主时钟以及子时钟，可以有效保证较低的功耗，但在使用串口的通信的过程中，数据传输的错误达到了大约44%。 在TI官网给出的数据手册中，MSP430F5529LP在开机上电后，默认的时钟频率为0.8 MHZ到1.5 MHZ，在系统稳定后，数控振荡器默认为2 MHZ，FLL默认2分频，主时钟和子时钟的频率都为1.1 MHZ，在此种情况下，如果只是对串口发送和接收的数据进行接收而不进行数据处理，可以保证在串口通信下数据能够进行可靠的传输，但是在本系统中，串口0的中断是在语音模块传输数据的时刻产生的，在接收串口传输数据的同时，还需要对数据进行处理，1.1 MHZ的主时钟频率就显得比较的慢。而我经过测试，主时钟为1.1 MHZ并加入了对串口传输数据进行处理的情况下，从串口0中接收的数据会有丢失，即单片机向语音识别模块发送3个字节的控制命令，语音识别模块会有一个3个字节的返回值，但通过串口只能接收到2个字节的数据，无法判断控制指令是否成功发送。 最后一个16 MHZ是本系统的主时钟所采用的时钟频率，该时钟频率通过锁相环将MSP430F5529LP单片机P5.2和P5.3引脚外接的4 MHZ外部高频震荡源倍频后得到，在本系统中，只有在进行串口通信时才需要较高的时钟频率，在这里使用16 MHZ的主时钟即可满足，并且经过测试，以16 MHZ的主时钟频率进行串口通信时，不会出现数据传输错误或者丢失。因此，在主系统时钟已经能够满足本系统的基本需求的情况下，系统的子时钟则是配置的1 MHZ，是将外部晶振经过锁相环分频后得到的，能够在一定程度上节省功耗。 MSP430F5529LP最高能够倍频到44 MHZ，但是在本系统中使用16 MHZ即可满足需求，继续升频只会带来更高的功耗，因此不对更高的时钟频率进行考虑和对比。 4.4. 语音识别程序 本系统采用的是离线语音识别模块，能够自动收集用户的语音信息，将处理后的结果与语音识别模块的片内ROM中存储的词条进行比对，比对的结果会通过串口反馈至单片机中。语音识别模块在发送的数据时会触发单片机的串口中断0，在中断处理程序中使用一个数组将相关的数据进行存储，以3个字节为一个单位。同样的，在程序中，使用了多个数组，对连续识别指令、退出识别指令、初始化指令等进行存储，在对语音识别模块发送控制命令时能够直接调用，控制指令如表1语音识别模块控制指令及返回值对应表所示。 Table 1 Corresponding table of control instructions and return values of speech recognition modul 指令 指令编码 返回值 初始化 0xA0A0A0 0x505050 连续识别 0xABAB00 0X5B0000 (后两字节代表字条ID) 切换组 0xA90000 (后两字节代表组别ID) 0x590000 (后两字节代表组别ID) 退出识别 0xACAC00 0x5C0000 表1. 语音识别模块控制指令及返回值对应表 语音识别模块在向单片机发送处理结果时所触发的串口中断0具体代码如下所示： while(!(UCA0IFG & UCTXIFG)); UCA1TXBUF = UCA0RXBUF; receive_data[receive_data_id] = UCA0RXBUF; receive_data_id++; if(receive_data_id%3 == 0) receive_data_id = 0; 4.5. 四路舵机控制程序 在本系统中，单片机能够直接控制4个垃圾桶桶盖的转动，即能够控制4个舵机工作。单片机中Timer0_A在比较和增减模式下具有PWM输出功能并配备了五个比较捕获器，因此，在本系统中，我使用了Timer0_A下的四个比较捕获器产生了四路PWM输出以控制舵机进行运转。 本系统中使用的舵机型号为SG90 (180度)，对于该种舵机，一般需要一个20 ms的时基脉冲，该脉冲的高电平部分占用达到0.5 ms至2.5 ms时，可以控制舵机转动到固定角度，它们之间的对应关系如表2高电平占用时间、舵机转动角度与占空比之间的对应关系所示。 Table 2 The corresponding relationship between high level occupancy time， steering gear rotation Angle and duty rati 高电平所占时间 转动角度 占空比 0.5 ms 0˚ 2.5% 1.0 ms 45˚ 5% 1.5 ms 90˚ 7.5% 2.0 ms 135˚ 10% 2.5 ms 180˚ 12.5% 表2. 高电平占用时间、舵机转动角度与占空比之间的对应关系 在时钟配置中，子系统时钟所设置的频率为1MHZ，在此处作为Timer0_A的时钟源，当CCR0(计数终值)置为20，000时，PWM的周期为20 ms。此时Timer0_A的比较捕获器CCR1置为19，000时，对应占空比为2.5%，舵机会转动45度。同理，Timer0_A其他三路的比较捕获器的值可以通过占空比计算得到，从而使得舵机转动固定角度，舵机控制的具体配置代码如下所示。 P1DIR |= (BIT2 + BIT3 + BIT4 + BIT5 + BIT0); P1SEL |= (BIT2 + BIT3 + BIT4 + BIT5); TA0CCR0 = PWMPeriod; TA0CCTL2 = OUTMOD_7; TA0CCTL1 = OUTMOD_7; TA0CCTL3 = OUTMOD_7; TA0CCTL4 = OUTMOD_7; TA0CTL = TASSEL_2 + MC_1;