useisbb 发表于 2013-2-21 21:26:41

stc高速输出问题分析

本人用到一块AD需要外接时钟
时钟要求是1M的采样时钟
有计划用STC的4052。一有串行总线SPI。而来可以配出1M的时钟用12M晶振12分频就可以了,4052有高速输出和PWM两种方式能得到1M时钟。
理论成立开始调试SPI,这个要说是SPI真是有点牵强,配置寄存器一团乱糟糟,曾今配置过几片ARM,发现配置和调试很条理。
经过好多努力SPI没问题了,但是那片AD非要收发均是上升沿采样,最终放弃硬件SPI,软件实现了。

再说可气的高速输出。这个高速输出说白了就是一个定时器,只不过是一次又一次的去匹配,匹配完成需要中断来更新下一次的值。
程序如下
#include <STC12C2052AD.H>//单片机头文件
#define uchar unsigned char
#define uint unsigned int
#define   FOSC16021258
#define   T100KHz(FOSC/4/100000)

ucharcnt;
uintvalue;
void PCA_isr( ) interrupt 7 using 1
{
CCF0 = 0;   //清除中断标志
CCAP0L =value;
CCAP0H =value >> 8; //更新的值进行比较
value+= 100KHz;
}
void main()
{
CCON = 0;
//初始化PCA控制寄存器,计时器停止,清除CF标志位,清除所有模块中断标志                     
CL = 0;      //PCA定时器复位
CH = 0;                                                               
CMOD = 0x02;//设置PCA定时器时钟源为Fosc/2,禁用PCA定时器溢出中断
value = T100KHz;                                       
CCAP0L =value;   //P3.7 100kHz方波输出
CCAP0H =value >> 8;
value+= T100KHz;            
CCAPM0 = 0x4d; //设置PCA模块0工作在16为高速输出状态
CR = 1;   //PCA 计时器开始运行
EPCA_LVD=1;
EA = 1;
cnt = 0;
while (1);
}

其实程序所谓的初始化唯一有用的只有
几句配时钟;开中断;开计数器;
像什么清零和初值全是多余的,经过一次计数自然就正常了,套路而已。

再看看中断干什么,其实更简单。
整个流程就是让匹配寄存器的值每次递增要实现频率的半周期时间。
这里的value是半周期时间也是翻转时间。看框图意思就是匹配后翻转P37或35

如上程序配置实用16M晶振能实现100M。
按照STC 手册介绍只要减少value的值也就是匹配的递增量,即可实现高速。
#define   FOSC16021258
#define   T100KHz(FOSC/4/100000)
value的值最终也就是40多点,没细算。
我在程序里直接宏定义了T100KHz=10、20、30、40、50、。
总结除了规律如果这个值一旦小于40时候(任何时钟时钟),30时输出脉冲频率多数为86HZ部分小毛刺,20时58HZ。
只有大于40才能正常按照计算值工作。
按照 公式value=12000000/(4*1000000)=3;输出结果不言而喻。


为什么会这样呢?问题出在中断,由于每次匹配便会产生中断一次。
要执行如下代码
value是int型的
CCF0 = 0;   //清除中断标志
CCAP0L =value;
CCAP0H =value >> 8; //更新的值进行比较
value+= 100KHz;
大家可以看一下KEIL执行仿真后翻译的汇编,调试发现一个接一个跳转,处理的效率低下。
如果没有足够的时间会造成中断溢出。造成程序奔溃。

这种半软半硬的高速加上使用C编译器,STC的问题就暴露了。经过实际测试16M最高也就产生100M。前提的PCA中断最高级,就这单片机有很多的时间已经被PCA中断占用。


下面说说可恶的PWM模式,我看了一下可以直接产生主频的12分频不是正好1M吗?
再来个50%就可以搞定,PWM是全硬件自动装载,应该可以呀。
11M晶振实测12分频输出频率高达3.6KHZ没错是3.6KHZ。真是悲惨呀。使用2分频测试是21KHZ

我没有截图,由于已经放弃了STC产生采样时钟的方案,硬件和软件已经改变。

顺便建议阿莫能加一个截图工具。否则很不方便。做的时候想写没时间。过后了截图不方便。



饭桶 发表于 2013-2-21 21:44:12

看来你真不懂单片机

liwei_jlu 发表于 2013-2-21 22:07:32

stc躺着也中枪

Sullivan 发表于 2013-2-21 22:14:59

花51的钱还想要Dsp的性能?

lcw_swust 发表于 2013-2-22 13:49:44

STC12C56**
STC12C5A**
有“可编程时钟输出”功能

清雨影 发表于 2013-2-23 21:02:03

Sullivan 发表于 2013-2-21 22:14 static/image/common/back.gif
花51的钱还想要Dsp的性能?

话不能这么说,有的时候其的魅力就在于用最少的资源实现最大的功能,效益,比如用1.5k的ID给十亿数据编上号的,CSDN上的那个神贴.

SilverBullet 发表于 2013-2-23 21:36:20

清雨影 发表于 2013-2-23 21:02 static/image/common/back.gif
话不能这么说,有的时候其的魅力就在于用最少的资源实现最大的功能,效益,比如用1.5k的ID给十亿数据编上号 ...

兄弟,算法很难逾越硬件的鸿沟啊……

useisbb 发表于 2013-2-27 23:34:51

苦逼的我增加了几毛钱弄了个晶振电路也能跑了

useisbb 发表于 2013-4-4 00:20:28

气死人的STC,从未用过这么垃圾的东西,没下载3,4次程序,就会蓝屏一次,偶尔keil编译器保存的代码也会随之消失,害的我的程序丢了3次,几天的白写了。看来这STC只能用于代码小于1K的玩玩。不能信的烂货。{:huffy:}

aureole 发表于 2013-4-4 02:29:23

useisbb 发表于 2013-4-4 00:20 static/image/common/back.gif
气死人的STC,从未用过这么垃圾的东西,没下载3,4次程序,就会蓝屏一次,偶尔keil编译器保存的代码也会随 ...

不看好 stc,但是我估计你的蓝屏应该是 劣质的u转串引起的。。。

diego2003 发表于 2020-1-16 11:32:59

stc高速输出问题分析 MARK.
页: [1]
查看完整版本: stc高速输出问题分析