搜索
bottom↓
回复: 16

PWM使能时的引脚初始电平能控制吗?

[复制链接]

出0入0汤圆

发表于 2008-7-8 16:58:29 | 显示全部楼层 |阅读模式
请教马老师:MEGA64的TC1工作在快速PWM模式下,在使能OC1A时,引脚电平自动拉低一个定时周期后才输出指定的PWM波。我尝试更改了COM1A0/1的相关设置,以及使能前设置ICR的值和OCR的值相同,均无法控制引脚的电平。由于起始时引脚电平的改变不能忽略,请问难道真的没办法控制吗?

出0入0汤圆

发表于 2008-7-8 23:44:20 | 显示全部楼层
如下处理试一下:

初始化时先将引脚设置成输出高电平,然后启动PWM,注意COMn的正确设置(=10)。

出0入0汤圆

 楼主| 发表于 2008-7-9 09:40:31 | 显示全部楼层
谢谢马老师的回复。
我在使能OCR引脚前,已用SBI指令设置了初始电平为高,甚至试过了引脚初始为低的情况。总是在我设好ICR和OCR的值后,一调用如下 Enable_TC1_PWM 宏时引脚电平即维持一个定时周期的低电平。
.macro        Enable_TC1_PWM
  sbi  Signal_Out_Port,Signal_CHA_OutBit
  ldi  r16,(1<<WGM13)|(1<<WGM12)
  out  TCCR1B,r16
  ldi  r16,(1<<COM1A1)|(1<<COM1B1)|(1<<COM1C1)|(1<<WGM11)                               
  out  TCCR1A,r16                               
.endmacro

.macro        Disable_TC1_PWM               
  ldi  r16,0x00
  out  TCCR1A,r16
  ldi  r16,0x00
  out  TCCR1B,r16
  sbi  Signal_Out_Port,Signal_CHA_OutBit
.endmacro

这种现象在其他厂家的MCU上似乎也存在。按我的理解:在MCU允许PWM模块时,此时TC是停止的,引脚瞬间拉低(或高)是可以理解的,但启动TC运行后,引脚电平应该立刻如实的符合COMnAx的指定才对,这在逻辑上实现似乎并不难啊。(通过跟踪,发现使能前除了ICF1标识位置位外其余标识位均清零,在AVRStudio中手工清除ICF1,再继续执行调用Enable_TC1_PWM,情况依旧)。
我觉得Atmel的官方资料上回避了对这个问题的说明。请问马老师是否注意到这个问题?如实在无法解决,我只有将信号反转再改动硬件了。

出0入0汤圆

发表于 2008-7-9 10:45:22 | 显示全部楼层
在  sbi  Signal_Out_Port,Signal_CHA_OutBit 前是否已经将其设置为输出方式了(DDRn = 1)。

出0入0汤圆

 楼主| 发表于 2008-7-9 15:37:17 | 显示全部楼层
已经做了初始化。
ldi r16,0b11100111        ;设置B口:Pb3,Pb4为输入,上拉有效;其余为输出口,初始输出高
out ddrb,r16
ldi r16,0xFF
out portb,r16
这种情况只有第一个定时周期是这样,后续的周期波形是对的。
由于我启动PWM后,在比较匹配中断中作计数或定时判断处理,所以通过示波器发现了这种情况。
虽然目前有办法避过这个问题,但我还是想弄个究竟。

出0入0汤圆

发表于 2008-7-9 16:24:46 | 显示全部楼层
有时间我试一下。如果真是如此,需要询问ATMEL了。

出0入0汤圆

 楼主| 发表于 2008-7-9 16:42:18 | 显示全部楼层
谢谢马老师的关注。

出0入0汤圆

发表于 2008-7-10 00:17:59 | 显示全部楼层
帮你仔细查看了手册,注意下面的解释:

Using the Output Compare Unit
......
The setup of the OC0 should be performed before setting the Data Direction Register for the port pin to output. The easiest way of setting the OC0 value is to use the Force Output Compare (FOC0) strobe bits in Normal mode. The OC0 Register keeps its value even when changing between waveform generation modes.

Be aware that the COM01:0 bits are not double buffered together with the compare value. Changing the COM01:0 bits will take effect immediately.

因此,建议你如下操作试试:

1。初始化时,设置I/O为输出方式,输出1;设置标志位FOCn为1,强行置OC0为1。(此时I/O输出还是是PORT的值)
2。配置T/C时,关闭计数脉冲,清另计数器,正确配置工作方式,开计数脉冲。

我认为应该可以了。

出0入0汤圆

 楼主| 发表于 2008-7-10 11:04:53 | 显示全部楼层
非常感谢。
我有点明白您的意思了。但我还有几点疑问:
1。您提到的关于强制输出比较:“The easiest way of setting the OCnx value is to use the Force Output Compare
(FOCnx) strobe bits in Normal mode.”,与手册中同页所提到的:In non-PWM waveform generation modes, the match output of the comparator can be forced by writing a one to the Force Output Compare (FOCnx) bit.以及和在P138页中的描述:The FOCnA/FOCnB/FOCnC bits are only active when the WGMn3:0 bits specifies a non-PWM mode.似乎对于工作方式的描述不太明白。
   我的理解是:TC的工作模式可分为:普通模式(不占用OCnx引脚),CTC模式,PWM模式(快速PWM,相位可调,以及频率/相位可调)。后两项又可归属于波形发生器模式。
   Normal mode即普通模式,在普通模式下,不占用OCnx引脚,那么又如何能通过强制输出比较来设置OCnx的电平呢?
   非PWM波形发生器模式(Non-PWM waveform generation mode),应该单指 CTC(CTC本质是为了形成方波,而无脉宽调制的意思,虽然可以实现脉宽可变的波形)。因为Normal Mode明显不是“波形发生器”。
  不知这样理解是否正确,我将在程序中验证一下。

2。您提到的:“The setup of the OC0 should be performed before setting the Data Direction Register for the port pin to output.”,是否可以这样理解:在PWM使能前,OCnx的引脚方向如果设为输入且上拉到高,那么在切换到PWM时将不影响引脚电平。切换后我再将引脚设置为输出高,并启动定时器。(思想源自您所著的《ATMega8原理及应用手册》P72页最后一段的描述》)

3。据您所提到的:“The OC0 Register keeps its value even when changing between waveform generation modes.”,那么如果我能够先通过在CTC模式下控制OCnx的电平,再切换回PWM模式,理论上OCnx的电平也不会变。但这样还是回到了第2点。

现在发现关键点是:只要一置位COMnAx,OCnx引脚电平就会变,与您在Mega8书中描述的是一致的。所以现在只能寄希望于再次测试了。

出0入0汤圆

 楼主| 发表于 2008-7-10 11:27:49 | 显示全部楼层
是不是我特爱钻牛角尖了?马老师您也真有耐心,真心感谢,同时也相当佩服您在论坛上“较真”的帖子。

对于工作中碰到的问题,其原因有些很简单,有些很复杂。复杂的时候总想跳过去,但我尽量不想再这样,因为我知道也经历过:没解决的问题会时刻伴随你,随时会蹦出来成为你的噩梦。

在这里我也想请教看到这个帖子的各位同行,是否碰到过这个现象,有什么高招。

马老师也挺忙的,对于您的关心表示真心的感谢。

由于要准备另一个项目,我只能在空闲时测试了(但随时会关注这个帖子),到时再将结果告知大家。

谢谢大家的关注和支持。

出0入0汤圆

发表于 2008-7-10 13:26:25 | 显示全部楼层
初始状态I/O的电平在某些控制系统中是非常重要的,不是“钻牛角尖”了。

先看下图,是比较匹配输出的电路:


(原文件名:8-6.jpg)

可以看出DDR仍旧控制输出方向,两个COMn控制输出选择(PORT和OCn)。

当常规计数方式时,COMn都是0,输出为PORT的值,一旦PWM方式(包括CTC的比较匹配输出方式),只要COMn中有一个为1,则输出为OCn的值。

所以在PWM前使用FOCn将OCn先强制为1,一旦转换为PWM时(设置其中的COMn为1),开始输出的就是OCn的初值1,以后OCn就根据由PWM模式下控制了。

注意OCn是内部的一个寄存器,它的值可以由FOCn置1,但不一定就反映在I/O口上的,由COMn决定。

出0入0汤圆

 楼主| 发表于 2008-7-10 17:26:08 | 显示全部楼层
受益非浅。是我浮躁了,没有仔细分辨OCnx寄存器和OCnx引脚间的区别。惭愧。
如此一来我的第2点是完全错误的,完全误解了您在Mega8书中所写的OC1A(OC1B),他们是指寄存器,而非指引脚。
但是FOCn只是作用于波形发生器的一个选通信号,至于发生器生成什么信号还处决于COMnx的设置。(When writing a logical one to the FOCnA/FOCnB/FOCnC bit, an immediate Compare Match is forced on the waveform generation unit. The OCnA/OCnB/OCnC output is changed according to its COMnx1:0 bits setting. Note that the FOCnA/FOCnB/FOCnC bits are implemented
as strobes. Therefore it is the value present in the COMnx1:0 bits that determine the effect of the forced compare.)
似乎我应该先拉低,再等一个时钟,让MCU感知到引脚当前状态后再置位FOCn,让其取反,得到我需要的高电平信号。
恩,就这样试下先。

出0入0汤圆

 楼主| 发表于 2008-7-11 14:50:10 | 显示全部楼层
大致试出来了,但效果并不太理想。
我是在Normal模式下,端口输出高。先设置COMnx1:0为3,比较匹配时置位OCnx。接着马上置位FOCn。这样OCnx引脚的电平在短暂拉低后恢复到高电平。大致会占用5个时钟周期。这个顺序是不能颠倒的。颠倒时引脚电平不受FOCn的控制。

总结的大致规律是:在切换到PWM时,MCU会根据COMnx的设置自动将OCnx引脚的电平拉到匹配时的值。(尽管此时没有任何标示位,在除了ICF1)。只有用设置强制输出比较位的办法才可设置引脚电平。但由此带来的一个时段的错误电平也是不可忽略的。我想可能还是ATMEL芯片设计的问题吧。

谢谢马老师的指导。

出0入0汤圆

发表于 2008-7-11 17:28:38 | 显示全部楼层
好象你的设置过程有问题。如下试试(保证PWM开始“1”的情况):

1。T/C在Normal时,设置DDR为输出,PORT输出“1”=====》此时输出的是PORT的“1”
2。停止T/C计数,清另T/C(或TCNTn = 1?)===========》此时输出的是PORT的“1”
3。设置比较寄存器(假定)为180=====================》此时输出的是PORT的“1”
4。写FOCn,强置OCn为“1”==========================》此时输出的是PORT的“1”
5。设置COMn1:0为2,比较匹配时清另OCn!!!=========》此时变为输出OCn的值,由于TCNTn小于比较值,按道理OCn也为“1”
6。启动T/C计数,当TCNTn = 比较值时,OCn清另为“0”==》此时输出为OCn,OCn由PWM控制

出0入0汤圆

发表于 2009-4-21 22:17:41 | 显示全部楼层
留下记号!

出0入0汤圆

发表于 2010-8-8 18:00:25 | 显示全部楼层
Mark~

出0入0汤圆

发表于 2010-8-14 11:42:24 | 显示全部楼层
看了上面马老师的10楼上的一句话“注意OCn是内部的一个寄存器,它的值可以由FOCn置1,但不一定就反映在I/O口上的,由COMn决定。”觉得跟M16英文版的数据手册上的说法有些出入,FOCn只是起选通的作用而已,是否置1要看COMn。(还是不同的型号不同?)

    首先,看看关于FOCn的解释,后面为原文:When writing a logical one to the FOCn bit, an immediate compare match is forced on the Waveform Generation unit. The OC0 output is changed according to its COMn1:0 bits setting. Note that the FOCn bit is implemented as a strobe. Therefore it is the value present in the COM01:0 bits that determines the effect of the forced compare.

    然后,看看在非PWM模式下,比较输出模式表:
    When OCn is connected to the pin(此处说明是OCn寄存器), the function of the COMn1:0 bits depends on the WGMn1:0 bit setting.
如图:

Table39.Compare Output Mode, non-PWM Mode (原文件名:Snap1.jpg)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:55

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

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