基于VC的MV05芯片PWM功能测试软件设计
扫描二维码
随时随地手机看文章
摘要:本文介绍了MV05芯片的特性和PWM模块各个寄存器的用途,概述了VC++的基本知识和在VC++6.0中使用MSComm控件开发串口通信程序的方法。针对PWM模块的特点给出了PC机与MV05的通信协议、数据包格式、以及PWM用户自定义模式下的编程代码和软件界面图。
1 引言
在微电子行业,芯片封装好后无不例外要进行系统级的验证,以检查芯片功能是否正确。 MV05 芯片是本课题组自主设计的一款芯片,本文介绍了一种对该芯片进行测试的方法,上 位机通过芯片内置的一个单独UART 通讯模块向下位机发送指令,再判断芯片执行指令是否 正确,从而确定芯片功能是否符合设计要求。
上位机使用VC++编写控制软件,VC++由于功能强大和应用灵活, 得到Microsoft 系统的 最好支持, 具有图形界面友好、系统资源丰富、操作配置方便、运行速度较快等特点。而串 口通信具有实现简单, 使用灵活方便, 数据传输可靠等优点, 因而用VC++编制串口实时控 制软件十分方便[1]。下位机使用汇编语言编程,汇编语言使用灵活,执行效率高,在芯片测 试方面非常实用。MV05具有8051的所有功能,在其基础上增加了PWM功能,本文只对PWM功能 测试进行介绍。 2 芯片简介 MV05是上海大学微电子研究与开发中心自主研发的一款芯片,完全拥有自主知识产权, 该芯片用于对汽车发动机冷却风扇的控制。此芯片含一个8051系列内核的CPU,它的指令集 与标准8051内核完全兼容。经过重新设计的内核,指令周期变为4个系统时钟周期。相比标 准8051平均效率提高2.5倍。作为标准8051CPU,含有一个8位的CPU内核,8位指令操作代码, 8位操作数,8位数据总线以及16位地址总线。内置两路PWM输出,一个单独的UART通讯模块 , 工作电压3.3V,采用chartered0.35um 2p4m CMOS工艺。
PWM 模块具有自定义输出和动态跟踪外部信号两种功能,通过设置PWMMODE 来选择这两 种功能,而且两路PWM 具有独立和互补的工作模式。当工作在独立模式时,两路PWM 可独立 输出PWM 波。芯片的PWM 功能复用到p1 口上,其中p1.2,p1.3 用于捕获输入,P1.4,P1.5 用于PWM 双通道脉宽调制输出信号。PWM 模块定义的寄存器如下:
PWMMODE: PWM 方式寄存器用于对对PWM 的工作方式进行设置,包括用户自定义模式和捕获外部输入信号模式。
PWMCON: PWM 控制寄存器,用来控制PWM 功能的开启和关闭。
Tcap1CON: 捕获1 控制寄存器,用于设置捕获采样的外部信号周期数
Tcap2CON 捕获2 控制寄存器,用于设置捕获采样的外部信号周期数
UTL0 PWM0输出的周期寄存器低8 位
UTH0 PWM0输出的周期寄存器高8 位
UWL0 PWM0输出的脉宽寄存器低8 位
UWH0 PWM0输出的脉宽寄存器高8 位
UTL1 PWM1输出的周期寄存器低8 位
UTH1 PWM1输出的周期寄存器高8 位
UWL1 PWM1输出的脉宽寄存器低8 位
UWH1 PWM1输出的脉宽寄存器高8 位
UTL0,UTH0 ,UWL0 ,UWH0 ,UTL1,UTH1,UWL1,UWH1 用于用户自定义模式下PWM 波占空比的设置[2]。
3 上下位机通信协议
上下位机进行通信就要约定通信协议。上位机每次向下位机发送数据时首先发送“48 59 4c”3 个数据, 下位机判断接收到的前3 个数据是不是“48 59 4c”,如果是则继续接收后 面的数据,否则丢弃数据。“48,59,4c”后面紧跟的是8bit 数据,下位机接收到该8bit 数 据后进行按位解析,按照约定相应的位进入相应的特殊功能寄存器,下位机配置好特殊功能 寄存器后便会执行相应操作,从而验证芯片功能是否正确。通过该协议可以降低下位机的编 程复杂度,接收一次数据就可以将所需配置的寄存器配置好,从而也提高了通信的效率。PWM 用户自定义模式下的数据包的格式如表1 所示。
PWM 捕获模式下与PWM 用户自定义模式的数据包除了bit4~bit2 三位表示的意义不同 外,其余各位表示的意义相同,捕获模式下 bit4~bit2 用来设置捕获外部信号的周期数: 000:单个周期;001:两个周期;010:4 个周期依次类推周期数成倍增长。
4 上位机软件设计
本文上位机软件使用VC++6.0 开发。使用VC++最重要的就是能够了解控件的属性,熟 练对控件编程。VC++6.0 中的每个控件都有一个ID 号进行标识,每个ID 可以映射成一个变 量或响应函数。VC++6.0 中的类是方法和变量的总和,通过例化该类使用其中的方法和变量, 如本软件中的串口设置对话框:
CSettingDlg setDlg; // 例化
m_nPort = setDlg.m_nPort; //变量传递 将CsettingDlg 中的
m_nTime = setDlg.m_nTime; //变量映射到主控类的变量
m_strSettings = setDlg.m_strSettings;
4.1 串口通信模块设计
在Microsoft Windows 下开发串行通信程序的方法有:(1)利用WindowsAPI通信函 数(2)利用Windows的读写端口函数或开发驱动程序直接对串口进行操作(3)利用第三方 提供的通信类(4)使用串口通信组件。其中第四种方法较简单,只需要对串口进行简单设置[3]。本上位机串口通信程序使用MSComm控件进行开发。
MSComm控件是Microsoft公司提供 的简化Windows下串行接口收发数据的简便方法。MSComm处理数据有两种方法, 查询法和事 件驱动法[4],本文使用事件驱动法。 串口设置对话框独立于主对话框,通过串口设置按钮弹出,用户可以在串口设置对话框 中进行串口选择,设置波特率、停止位、校验位等参数[4]。软件在主控类中定义了一个全局 变量m_strSendString,上位机要发送的数据赋给该变量,然后通过发送函数发送出去。
4.2 PWM 模块
PWM 模块包括PWM 用户自定义模块和PWM 捕获模块,PWM 捕获模块与PWM 用户自定义模 块在控件使用和编程思想上是一样的,只不过数据包各位代表的意义不同,因此这里只介绍 PWM 用户自定义模块,PWM 捕获模块不再赘述。
PWM 用户自定义模块可以设置芯片PWM 模块的工作周期和PWM 波不同占空比,另外还增 加了ADC 联动功能。增加ADC 联动功能是为了测试下一款芯片功能设计的,此次测试并未用 到。PWM 模块的工作周期选择,PWM 波占空比选择和ADC 联动功能选择用复选框表示,用户 根据自己测试需要,选择不同的选项,最后按“确定”按钮将所选项目封装成数据包,按“启 动PWM”按钮将测试指令发送到下位机,进行测试。
根据通信协议将用户选择测试的项目封装成一个8 位数据包,该数据包存放在一个整型 数组里面,将该8 位数据看作是一个字符的二进制表示,根据每位数据所占的权值取加权和 得到一个10 进制数,最后将该10 进制数转化为一个16 进制数,该16 进制数就是最终要封 装的数据包。为了防止用户误选测试项目,软件中作了一些安全处理,当用户选择同类中的 一个测试项目后其它项目会变为不可选。软件界面如图1 所示。
PWM 用户自定义模式下数据包封装函数代码如下:
void CCommWizardDlg::OnButtonUsrMode()
{ UpdateData(TRUE); //数据更新
CString strtemp;
int s1[9]; //存放数据包数据的数组
unsigned char c1;
// 时钟选择
if(this->m_Check1) {s1[6]=0;s1[7]=0;}// 单时钟
if(this->m_Check2) {s1[6]=0;s1[7]=1;}// 双时钟
if(this->m_Check3) {s1[6]=1;s1[7]=0;}// 四时钟
if(this->m_Check4) {s1[6]=1;s1[7]=1;}// 12 时钟
//占空比设置
if(this->m_Check9) {s1[3]=0;s1[4]=0;s1[5]=0;}// 1:1
if(this->m_Check10) {s1[3]=0;s1[4]=0;s1[5]=1;}// 1:2
if(this->m_Check11) {s1[3]=0;s1[4]=1;s1[5]=0;}//1:3
if(this->m_Check12) {s1[3]=0;s1[4]=1;s1[5]=1;}//1:4
if(this->m_Check13) {s1[3]=1;s1[4]=0;s1[5]=0;}//1:5
if(this->m_Check14) {s1[3]=1;s1[4]=0;s1[5]=1;}// 1:6
if(this->m_Check15) {s1[3]=1;s1[4]=1;s1[5]=0;}// 1:7
if(this->m_Check16) {s1[3]=1;s1[4]=1;s1[5]=1;}// 1:8
//PWM -ADC 控制
if(this->m_Check5) {s1[1]=0;s1[2]=0;}// 0 主0 控
if(this->m_Check6) {s1[1]=0;s1[2]=1;}// 0 主1 控
if(this->m_Check7) {s1[1]=1;s1[2]=0;}// 1 主0 控
if(this->m_Check8) {s1[1]=1;s1[2]=1;}// 1 主1 控
s1[0]=0; //用户自定义模式选择
c1=s1[0]*128+s1[1]*64+s1[2]*32+s1[3]*16+s1[4]*8+s1[5]*4+s1[6]*2+s1[7]*1 ;
strtemp.Format("%02X ",c1); //10 进制转化为16 进制
m_strSendString=(CString)"48 59 4C " + strtemp ;
}
5 下位机软件
下位机软件包括串口通信模块和PWM 功能配置模块。串口部分使用中断方式接收数据, 当接收到上位机的命令执行中断服务程序转到PWM 功能配置模块,PWM 功能模块对接收到的 数据进行按位解析,根据通信协议将不同的数据位送到不同的寄存器。该方法对其它测试系 统具有借鉴意义。
6 结束语
本文介绍了上海大学微电子研究与开发中心研发的一款汽车发动机冷却风扇控制芯片, 给出一种使用VC++6.0编写上位机软件对其进行测试的方法。本文的创新点是构造数据封装 函数,将用户要测试的项目一次发送给下位机,下位机按位解析数据包,将相应数据位送入 相应寄存器。通过调试证明该方法是完全可行的,提高了测试效率,测试结果达到了预期设 计指标,芯片功能完全正确。