amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 10

stc高速输出问题分析

[复制链接]
(232444979)
发表于 2013-2-21 21:26:41 | 显示全部楼层 |阅读模式
本人用到一块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   FOSC  16021258
#define   T100KHz  (FOSC/4/100000)

uchar  cnt;
uint  value;
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   FOSC  16021258
#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产生采样时钟的方案,硬件和软件已经改变。

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



(232443928)
发表于 2013-2-21 21:44:12 | 显示全部楼层
看来你真不懂单片机
(232442528)
发表于 2013-2-21 22:07:32 | 显示全部楼层
stc躺着也中枪
(232442081)
发表于 2013-2-21 22:14:59 来自手机 | 显示全部楼层
花51的钱还想要Dsp的性能?
(232385996)
发表于 2013-2-22 13:49:44 | 显示全部楼层
STC12C56**
STC12C5A**
有“可编程时钟输出”功能
(232273657)
发表于 2013-2-23 21:02:03 | 显示全部楼层
Sullivan 发表于 2013-2-21 22:14
花51的钱还想要Dsp的性能?

话不能这么说,有的时候其的魅力就在于用最少的资源实现最大的功能,效益,比如用1.5k的ID给十亿数据编上号的,CSDN上的那个神贴.
(232271600)
发表于 2013-2-23 21:36:20 | 显示全部楼层
清雨影 发表于 2013-2-23 21:02
话不能这么说,有的时候其的魅力就在于用最少的资源实现最大的功能,效益,比如用1.5k的ID给十亿数据编上号 ...

兄弟,算法很难逾越硬件的鸿沟啊……
(231918889)
 楼主| 发表于 2013-2-27 23:34:51 | 显示全部楼层
苦逼的我增加了几毛钱弄了个晶振电路也能跑了
(228892152)
 楼主| 发表于 2013-4-4 00:20:28 | 显示全部楼层
气死人的STC,从未用过这么垃圾的东西,没下载3,4次程序,就会蓝屏一次,偶尔keil编译器保存的代码也会随之消失,害的我的程序丢了3次,几天的白写了。看来这STC只能用于代码小于1K的玩玩。不能信的烂货。
(228884417)
发表于 2013-4-4 02:29:23 | 显示全部楼层
useisbb 发表于 2013-4-4 00:20
气死人的STC,从未用过这么垃圾的东西,没下载3,4次程序,就会蓝屏一次,偶尔keil编译器保存的代码也会随 ...

不看好 stc,但是我估计你的蓝屏应该是 劣质的u转串引起的。。。
(14752601)
发表于 2020-1-16 11:32:59 | 显示全部楼层
stc高速输出问题分析 MARK.
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-5 05:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表