序
无论是做嵌入式硬件工程师,还是做嵌入式软件工程师,示波器的使用都可以算是必备技能了,因为我们在做一些牵扯到时序的项目时,遇到一些问题,看是看不出来的,用示波器抓波形往往更直观一些。恰好手头一个项目用到了SN74HC164PWRG4 串转并8位输出移位寄存器,这里以此为例讲下如何调试波形。
74HC164简介
1.管脚图
图1是该芯片管脚图,A,B是与非门输入端,Qa~Qh是8位并行输出端,CLR是清除寄存器内数据,CLK是时钟管脚。
2.逻辑图
从图2可以看出QA=!!(A&B)=A&B
,QB=!!QA=QA,即若B=1,则QA与A逻辑关系保持一致,另外QH是第一个时钟时的数值,QA是第八个时钟时的值。
3.真值表
图3是74H164的真值表,当CLR为0时,可以认为芯片不工作
案例
硬件原理图
图4是项目中的实际接法,用IO口1作为芯片唯一的数据输入端,IO口2模拟时钟输入端,输出端只用到了QA~QD(LED灯,低电平点亮)。
源代码
#define CHIPCLK PAout(3) //PA3作为时钟输入
#define CHIPDAT PAout(4) //PA4作为数据输入
/*参数高四位表示QA,QB,QC,QD,QA为最高位,为了符合人的习惯,点亮将相应位置一就行*/
/*中间加的几个延时使时钟与数据错开,看着更舒服*/
void led(uint8_t state)
{
uint8_t i;
for(i=0;i<8;i++) //需要移位8次(本项目实际4次也可以)
{
CHIPCLK=0; //和下面 CHIPCLK=1;组成一个上升沿用于数据移位
delay_us(10); //延时10us,记作delay_1
if(state&0x01) //从低位右移,数据切换
CHIPDAT = 0;
else
CHIPDAT = 1;
delay_us(10); //delay_2
CHIPCLK=1;//和上面 CHIPCLK=0;组成一个上升沿用于数据移位
state>>=1; //数据右移,准备下一次移位
delay_us(20); //delay_3
}
}
int main(void)
{
int j = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统组优先级
delay_init(); //延时初始化
RCC_Config(); //打开GPIOA时钟
GPIO_Config(); //将PA3和PA4配置成推挽输出
while(1)
{
led(0xA0); //0x1100 0000 点亮LED1,LED3
}
}
LED(0XA0)波形分析
上面那个代码是结合实际情况写的,对应波形看着不太协调(但是仅仅是看着不太协调,没有任何问题),调用led(0xa0),输出的8位应该是0101 1111,又因为是先发低位,所以按时序实际是1111 1010,看懂应该没问题,下面截图,黄色是时钟,蓝色是数据
1首先看下正确波形
看上图,从左至右,箭头处对应的是8个时钟上升沿,看相应时刻的数据电平 1111 1010,和算的一样,没毛病,下面以第8个时钟沿为例,分析下代码中三个延时的作用。
2.去掉delay_1(看代码延时注释)
结合上面代码分析,本来在第七个时钟的下降沿拉低之后,延时10us,蓝色高电平拉低,然后去掉delay_1时,在时钟拉低瞬间,数据切换蓝色电平拉低,瞬间觉得波形不好看了有木有(主要是不好分析波形了)。
2去掉delay_2
看红色箭头这里,本来蓝色电平拉低之后延时10us,时钟才拉高,结果去掉之后,蓝色电平拉低瞬间,时钟拉高,这时候波形更不协调了,那么delay_1和delay_2都去掉呢?
可以看到图形基本走样了,时钟线快变成一条直线。
3.去掉delay_3
可以看到去掉delay_3之后,每一次移位,时钟先拉低,然后完成数据切换,时钟拉高,但是拉高不做保持,瞬间拉低进行下一次移位,相当于时钟波形的高电平端被截掉了。
总结
本篇文章目的是给一个案例,一是如何从波形分析数据,二是如何设置合理的延时时间,从而使展现的波形更有利于分析。