极限编程题目A:输出方波

[复制链接]
5337|18
 楼主| lanyong 发表于 2009-4-29 09:34 | 显示全部楼层 |阅读模式
要求在某一i/o输出频率最高的方波.<br /><br />使用mcu为:<br /><br />A:pic10f系列.<br /><br />B:pic16f@5MIPS.<br /><br />请给出程序或者思路或者实测波形.<br /><br /><br />p.s:出个题目大家玩玩.
yewuyi 发表于 2009-4-29 12:01 | 显示全部楼层

~~

16F系列的很多有PWM<br /><br />10F系列的应该基本都没有PWM,只能软件做<br /><br />
 楼主| lanyong 发表于 2009-4-29 14:40 | 显示全部楼层

方波

http://zh.wikipedia.org/wiki/%E6%96%B9%E6%B3%A2<br /><br />在現實世界,數碼電子的頻寬有限,方波只能以有限的頻寬來表達,意味著我們只能取一個近此方波的波型。要得出這個合理的波型,最少要有基波(fundamental&nbsp;harmonic)和第三次谐波(third&nbsp;harmonic)。當然,谐波的數量越多,波型就越像一個方波。<br /><br />占空比(duty&nbsp;cycle)是方波值「1」佔一個周期的時間比例。真實方波的占空比是50%──即高值和低值占的時間一樣。方波的平均值是由占空比决定的,因此通过改变ON和OFF周期然后求平均数,有可能代表两个限制电平(limiting&nbsp;level)间的任意值。这是脉宽调制(pulse-width&nbsp;modulation)的基础。<br /><br />
 楼主| lanyong 发表于 2009-4-29 14:43 | 显示全部楼层

极限在于:频率最高和方波

yewuyi兄弟用硬件pwm做.<br /><br />极限得到频率是多少?<br /><br />请给个参数,哈哈.<br /><br />这个题目我估计要实际去做才有意思.
yewuyi 发表于 2009-4-29 15:23 | 显示全部楼层

呵呵,还真没仔细计算过,

如果硬件PWM的话:<br /><br />Tpwm=(PR2+1)*4*Tosc*TMR2pre<br /><br />假设4M的OSC,那么Tosc=0.25uS,TMR2pre=1:1,取PR2=0,那么最大似乎可达到1M的方波。<br /><br /><br />呵呵,事实上是否成立,例如PR2=0似乎就有点麻烦。
youss 发表于 2009-4-29 22:22 | 显示全部楼层

极限!!有意义吗?

假如从RB1输出:(题目是否作一具体说明),输出频率同晶振的关系,自已算吧...<br />这个就是极限<br />LOOP&nbsp;&nbsp;BCF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;LOOP<br /><br />PIC连续对I/O操作将出现问题,改用以下:输出方波对称<br />LOOP&nbsp;&nbsp;BCF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;LOOP
 楼主| lanyong 发表于 2009-4-30 09:47 | 显示全部楼层

haha,题目而已

你以为陈景润的&nbsp;1+1有什么实际的意义吗?<br /><br />另,你<br />LOOP&nbsp;&nbsp;BCF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;LOOP<br /><br />不是方波.请看楼上方波的定义.<br /><br /><br />你这样的方法<br />16f好象没有反转指令.<br /><br />否则应该是<br />LOOP&nbsp;&nbsp;btg&nbsp;rb,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;LOOP<br /><br />----------------<br />另,LOOP&nbsp;&nbsp;BCF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSF&nbsp;&nbsp;RB,1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;LOOP<br />频率才多少,哈哈.非极限也.
martin 发表于 2009-4-30 12:13 | 显示全部楼层

PIC10&PIC16

;对于PIC10,GP0输出clock,1/6&nbsp;Fcy<br />&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;OSCCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />start&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIS&nbsp;&nbsp;&nbsp;&nbsp;GPIO<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />loop<br />&nbsp;&nbsp;&nbsp;&nbsp;xorwf&nbsp;&nbsp;&nbsp;&nbsp;GPIO,F<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;<br /><br /><br />//对于PIC16,RC2输出clock,1/2&nbsp;Fcy<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRISC&nbsp;=&nbsp;0x00;//PORTC设置为输出<br />&nbsp;&nbsp;&nbsp;&nbsp;T2CON&nbsp;=&nbsp;0b00000100;//Timer2使能,分频为1:1<br />&nbsp;&nbsp;&nbsp;&nbsp;CCPR1L&nbsp;=&nbsp;0x00;//此处为0,占空比由CCP1CON&lt5:4&gt实现<br />&nbsp;&nbsp;&nbsp;&nbsp;PR2&nbsp;=&nbsp;0x01;//PWM周期=[(PR2)+1]*4*Tosc*(TMR2预分频值)<br />&nbsp;&nbsp;&nbsp;&nbsp;CCP1CON&nbsp;=&nbsp;0b00101111;//使能PWM,CCP1CON&lt5:4&gt为10<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;<br />}
 楼主| lanyong 发表于 2009-4-30 13:10 | 显示全部楼层

loop<br />&nbsp;&nbsp;&nbsp;&nbsp;xorwf&nbsp;&nbsp;&nbsp;&nbsp;GPIO,F<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;<br /><br />xorwf&nbsp;用得好.<br /><br />我看用swapf&nbsp;GPIO,F应该也可以.<br /><br />我看10F到这里估计也就极限了.<br /><br /><br />--------------<br /><br />pic16f&nbsp;应该还有机会.<br /><br />法2达到1/2&nbsp;Fcy.<br /><br />uart最高波特率.连续发0x55.&nbsp;(1&nbsp;8&nbsp;1stop&nbsp;bit).<br />
 楼主| lanyong 发表于 2009-4-30 13:23 | 显示全部楼层

整错了

法2达到1/2&nbsp;Fcy.<br /><br />uart最高波特率.连续发0x55.&nbsp;(1&nbsp;8&nbsp;1stop&nbsp;bit).<br /><br />只能达&nbsp;1/(2*4)&nbsp;Fcy.<br /><br />sorry.
xieyuanbin 发表于 2009-5-1 09:16 | 显示全部楼层

无需编程,大多数12,16系列可以以Fcy输出方波.

将OSC2引脚设置成CLKOUT即可输出与指令周期一致的方波.<br />但10F系列因无此功能,所以还是只能以指令方式实现.<br />另外如果要求不严格的话,除初始化程序外,可以用XORWF&nbsp;PORTX这样的指令填满程序空间,
 楼主| lanyong 发表于 2009-5-4 09:17 | 显示全部楼层

谢兄,非也

&quot;另外如果要求不严格的话,除初始化程序外,可以用XORWF&nbsp;PORTX这样的指令填满程序空间,&quot;<br /><br />无法得到连续的方波,绝对有突变.另你需要初始化,不可能跑到底又跑到头吧.<br /><br /><br />&quot;将OSC2引脚设置成CLKOUT即可输出与指令周期一致的方波&quot;<br /><br />为extrc&nbsp;带clkout,&nbsp;并不是很准确.<br /><br /><br />其实我们可以利用spi,或者同步uart的clk输出得到最高频率方波.<br />到这里,我看也就极限了吧.
xieyuanbin 发表于 2009-5-4 12:29 | 显示全部楼层

用外部振荡器可以实现

将OSC2引脚设置成CLKOUT即可输出与指令周期一致的方波
 楼主| lanyong 发表于 2009-5-4 13:01 | 显示全部楼层

对,

不过外部时钟是否可控.<br /><br />spi时钟可控.不工作的时候就没了,哈哈.
yewuyi 发表于 2009-5-4 14:04 | 显示全部楼层

lanyong偏题

呵呵,你开始可没加这些条件。<br /><br /><br />其实啊,刚开始的时候,我也想说用CLKOUT输出,呵呵,但怕纠缠,所以就没说
 楼主| lanyong 发表于 2009-5-4 14:49 | 显示全部楼层

也没偏题啊

spi时钟需要编程才能得到.<br /><br />而谢兄才是偏题.他的时钟输出是不需要编程的.哈哈.<br /><br />出个小题目,大家玩玩,又没有糖分给大家.<br /><br />多谢参与.<br /><br />大家一起来整耍耍.
yewuyi 发表于 2009-5-4 14:59 | 显示全部楼层

呵呵,CLKOUT也需要编程啊

^_^,在CONFIG里面写上配置字也是编程一部分嘛
 楼主| lanyong 发表于 2009-5-5 09:03 | 显示全部楼层

兄弟,强也

你这样说,也对,哈哈.
icecut 发表于 2009-5-8 15:55 | 显示全部楼层

你们啊

我把引脚设置成输入,把晶振线短路过来.<br />我用有源晶振,保证方波质量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

457

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部