使用stc32g12k128(实际用了降龙棍核心板)和一个lcd显示屏,可以构建一个简易脉冲测量器,该测量器有很宽的测量范围和不错的精度,而且由于对硬件没有其它要求,可以在一般应用的系统上,临时写入程序,使其成为一个测量脉冲工具,下面分享我的程序和思路,供初学单片机的朋友参考。
一、硬件选择的考虑和功能
开始做这个东西的目的,是测量USB信号,48MHZ脉冲信号。相信stc32g12k128具有这个能力,使用jlx12864是看中它具有较快的显示速度。使用TFT彩屏时,传送一个点的数据需要两个8位传送指令,而jlx12864单色屏,一个8位传送指令送出的是8个点的显示信息。速度相差很大,这对高速脉冲的测量显示很有价值。但实际设计时却发现,stc32g12k128的PWM和SPI是共用时钟输入分频器的,如果想测48M的脉冲,必须让PWM工作在高速模式,但这样SPI也工作在高速模式了(我的屏是SPI接口),可是现在无论是屏还是IO接口,都不支持这样的高速。除非使用并口屏,因为手里没有并口屏,只好放弃了48M的测量。现在的搭配可以测量600HZ到10MHZ的脉冲信号(附图中有一个测量系统时钟的结果),因为对其它硬件没有要求。所以还是蛮有用的一个东东。
二、程序主体
程序分如下几个部分(完整程序在附件中)
1、mcu配置,这对PWM使用很重要,内容也多些。
2、lcd12864屏驱动,包括屏的初始化和屏显示用函数,这部分可以根据用户自己的屏进行修改,如果用户用的并口屏,可以试着测更高的频率。当然程序中的参数需要修改。重要的是开高速PWM模式。
3、中断函数,一个是PWM中断,用来捕捉周期和脉宽信号。一个是T0中断,只为在无被测信号时显示0.也就是超时清零。不过频率栏在无信号时用来显示系统时钟频率。
4、数字字模和汉字字模,分别在两个头文件中,方便修改。
测量11.0592MHZ芯片的时钟
测600HZPWM信号
测2000HZPWM信号
mcu配置和main如下:
#include "STC32G.H"
#include "stc32_12864driver.h"
#include "mcu_initial.h"
#include "initial_lcd.h"
#include "chinese_zhouqi.h"
unsigned long int cnt1,cnt2;
void main(void)
{
mcu_initial();
initial_lcd();
clear_screen();
transfer_chine_word(1,0,zhou);
transfer_chine_word(1,16,qi);
transfer_chine_word(3,0,zhan);
transfer_chine_word(3,16,kong);
transfer_chine_word(5,0,pin);
transfer_chine_word(5,16,lu);
EA=1;
ET0=1;
while (1)
{
digit6_display(1,32,cnt1);//以计数的形式显示周期值
digit6_display(3,32,cnt2);//以计数的形式显示脉宽
digit6_display(5,32,33177600/(cnt1+1));//显示转换后的频率值,单位HZ,无被测信号时显示单片机的时钟
}
}
void PWMA_ISR(void) interrupt 26 //测量脉冲的周期和脉宽
{
TR0=0;//关T0,中断响应期间免受T0中断影响
if (PWMA_SR1 & 0x02) //判断上升沿捕获中断是否发生
{
if (PWMA_SR1 & 0x02) //判断上升沿捕获中断是否发生
{
PWMA_SR1 &= ~0x02; //中断标志位清零
cnt1 = (PWMA_CCR1H << 8) + PWMA_CCR1L; //CC1 捕获周期宽度
}
if (PWMA_SR1 & 0x04) //判断下降沿捕获中断是否发生
{
PWMA_SR1 &= ~0x04; //中断标志位清零
cnt2 = (PWMA_CCR2H << 8) + PWMA_CCR2L; //CC2 捕获占空比(高电平宽度)
TH0=0;//T0初始化
TL0=0;
TR0=1;//开T0定时器
}
}
}
void tm0_isr(void) interrupt 1 //定时清屏幕显示
{
cnt2=0;
cnt1=0;
}
#include "mcu_initial.h"
#include "STC32G.H"
void mcu_initial(void)
{
P_SW1=0x04;
EAXFR = 1; //使能访问 XFR
CKCON = 0x00; //设置外部数据总线速度为最快
WTST = 0x00; //设置程序代码等待参数,
P1M0=0x00; //P1配置为高阻,其中的P1.6为双向。P1.0输入被检测脉冲
P1M1=0xbf;
P2M0=0xFF;
P2M1=0x00;
// AUXR |= 0x80; //定时器时钟1T模式,定时器用较慢模式,减少对测量可能产生的影响
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
MCLKOCR=0xff;//P1.6输出127分频系统时钟
HSSPI_CFG2=0X20;
SPSTAT=0x00;
SPCTL=0xd3;
PWMA_PS=0x00;//不需要选了,用默认值
//(CC1 捕获 TI1 上升沿,CC2 捕获 TI1 下降沿)
//CC1 捕获周期宽度,CC2 捕获高电平宽度
PWMA_CCER1 = 0x00; //捕获使能。采用了初始值
PWMA_CCMR1 = 0x01; //CC1 为输入模式,且映射到 TI1FP1 上
PWMA_CCMR2 =0x02; //CC2 为输入模式,且映射到 TI1FP2 上
PWMA_CCER1 = 0x11; //使能 CC1/CC2 上的捕获功能
PWMA_CCER1 |= 0x00; //设置捕获极性为 CC1 的上升沿
PWMA_CCER1 |= 0x20; //设置捕获极性为 CC2 的下降沿
PWMA_SMCR = 0x54; //TS=TI1FP1,SMS=TI1 上升沿复位模式
PWMA_IER = 0x06; //使能 CC1/CC2 捕获中断 。但TIE和UIE没开通
PWMA_CR1 |= 0x01; //使能计数器
}
三、使用效果
见附图吧测量时使用单独一个降龙棍核心板作信号发生器,产生600HZ,2000HZ的PWM信号和一个系统时钟输出,然后用本贴所述的系统对其进行测试。信号发生器的低频输出用虚拟示波器测试,测试结果与设定值相符。
四、存在的问题
1、在测量较低频率时出现的误差。超出预期。
2、高频时误差比预期小太多,应该引起重视(怀疑)。
3、可以用调整程序内容实现低频率的测量。
4、没有使用并口屏实现更高频率脉冲的捕捉。
有实力的朋友应该能够容易的解决存在的问题。
Keil代码下载:
Keil代码.7z
(25.82 KB, 下载次数: 35)
|