本帖最后由 Crime毛豆 于 2017-3-30 11:15 编辑
简单说一下,做了6个通道,接入频率信号。每秒读一次每个通道采集的信号个数。
计数采用的是4040,然后用4021将并行数据转成串行数据。
总结来说就是信号进来--4040计数---4021并转串----每一秒读取一次4021锁存的数值。
现在问题来了:只接入单个信号,显示计数值稳定,(比如都是50),无论换那个通道,只接入该信号,计数值都稳定为50.
但是,接入两个和两个以上信号,频率较低的信号计数值错误。。。
比如:单独接入1k 技术值稳定为50,
单独接入2k 计数值稳定为100,
1k和2k一起接入(1k接入通道1,2k接入通道2),1k的计数值变为80(总之就是远远偏大,但小于比它频率高的信号计数值)。2k计数值不变,仍旧为100.。。
不贴代码的不是好求助。。。代码主要只操作4021读数,所以只贴一个通道。。其他通道都是复制粘贴。。改变对应引脚就行。。。
主要问题是,在硬件和软件上都没有6个通道交叉的部分。。。不知道为什么会造成这个问题?。。。
小白一枚。。。
u8 CD4021_Read4(void)
{
u16 temp=0;
temp=CD4021_DAT4;
CD4021_CLK4=1;
CD4021_CLK4=1;
CD4021_CLK4=1;
CD4021_CLK4=1;
CD4021_CLK4=0;
return temp;
}
u8 CD4021_Receive4(void)
{
u16 key=0;
u16 SSF=0;
int SSFc=0;
u8 i=0;
for(i=0;i<12;i++)
{
key=CD4021_Read4();
SSF=key+SSF*2;
}
/*-----------------output original data-------------*/
SSFc=SSF-pre_SSF4; pre_SSF4=SSF;
return SSFc;
}
4021锁存用了一个特定信号,作为外部中断,中断一来就锁存数据,开始读。。。
void EXTI0_IRQHandler(void)
{
EXTI->IMR|=0X00000000; //???????? this statement do nothing
Ns=CD4021_Receive4();
EXTI_ClearITPendingBit(EXTI_Line0);//
}
采集精度问题。。。
你说的这种实现要是能达到要求,我干嘛弄这么复杂的。。。。
一周热门 更多>