这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请问,在互补PWM模式中AD的值与TRDRD0等之间的关系??

共9条 1/1 1 跳转至

请问,在互补PWM模式中AD的值与TRDRD0等之间的关系??

菜鸟
2008-04-03 14:19:12     打赏

瑞萨工程师你好:
        我在做互补PWM时和AD配合用的。利用PWM中的TRD0和trdgra0 比较匹配进行AD值传送的。AD在8位时是对的。但是我有10位AD时,发现AD 的高2位的值不传到TRDGRD0(也就是无法传入TRDGRB0)中,这样就失去10位AD的作用。请问这是什么原因形成的?

void ad_init(void)
{

 adcon0 = 0x07; 
 adcap = 1;
 adcon1 = 0x28; /* 28=10 bit mode cks1=0 setting / Vref connected */
  adcon2 = 0x00; 
 wait_vref();
 adic = 0x00;         // 中断位IR清零,中断优先级为0级 
 asm("NOP");            /* Waiting for stability */
 asm("NOP"); 
    adst = 0;            //A/D转换开始和停止位
    ad = 0x00;           //AD寄存器清零
    adge = 1;            //TRD1 比较匹配时输出 AD触发=1。
    adtrg = 1;           //允许A/D触发


trdgrd0 = ad;  //trdgrd0 值在比较匹配时传送 trdgrb0      
trdgrc1 = ad;      //问题就在这边,无法正常传高2位的值????  
trdgrd1 = ad;




关键词: 请问     互补     模式     TRDRD0     等之     间的     关系    

菜鸟
2008-04-03 16:36:00     打赏
2楼
 trd0 = 0;        /* The Count value of TRD0 is initialized of 0 */
 trdgra0 = 4000- 1;      /* 25ns * 4000 = 100us */
上面C语言程序。

以下是反汇编程序。

  trd0 = 0;        /* The Count value of TRD0 is initialized of 0 */
   MOV.W     #0H,0146H
 trdgra0 = 4000- 1;
MOV.W     #0F9FH,0148H

 trdgra0 分别在0148 0149H两个单元。而现在C里只有MOV.W     #0F9FH,0148H;
这肯定是错的,只送了9F到0148。而0F 到0149。却被程序丢了。
这个是你们瑞萨官方网上下的程序。里面有错。
按照这个 trdgra0 不能超过255。那有什么用啊。
请瑞萨工程师给于解决一下。谢谢。

助工
2008-04-03 16:45:36     打赏
3楼
    guicheng网友,关于你的问题,我在RSK上试验了一下。10位AD采样时,AD结果的高2位可以正常传送到TRDGRD0中,没有出现您说的问题。我的传送程序是这样的:
    
                        while(!ir_adic); //等待AD采样结束
                         ir_adic = 0;  //清除AD中断标志位
                         trdgrd0 = ad;   //将AD采样结果传送至TRDGRD0中
    
    您所用的互补PWM和AD配合的使用中,TRD1比较匹配时触发AD转换,而AD采样是需要一定时间的,如果触发后立即读取AD的值,这个值是不定的。我猜测你的问题可能出在这里,我没在您的程序中看到等待AD采样结束的过程。同时,有定时器RD来触发AD,要在adst = 1的前题下,我在您的程序中也没看到相关设定,请注意一下。
   如有疑问,欢迎继续讨论 :)

助工
2008-04-03 16:55:08     打赏
4楼

  trdgra0 = 4000- 1;
  MOV.W     #0F9FH,0148H
反汇编后用的是MOV.W,也就是按WORD的格式传送,传送的是16位啊,可以到FFFFH,这个没有问题的。我刚刚在试验您到PWM和AD那个问题时,TRDGRA0中存的数就是1024。
如果反汇编后是MOV.B那么TRDGRA0最多就只能存到255了。


菜鸟
2008-04-03 16:57:28     打赏
5楼
MOV.W     #0F9FH,0148H
是同时写16bits的指令
如果是MOV.B就是只写8bits

菜鸟
2008-04-07 09:04:01     打赏
6楼

谢谢你们的参与。我用互补PWM与AD转换程序是对的。我试了,很多次了。也与实际电压作了多次验证。现在关键是数据传送有问题???
就是传送trdgra0 = 1000-1;这样一个数值。在内存中看数据就有0148h里有数值。而 0149h里没有数据。说明在C中传送数据时丢失了高八位的数据。

谢谢大家能帮个忙。!!!


助工
2008-04-07 11:41:05     打赏
7楼

能否把您完整的程序放上来,我们运行一下看看,或是发到我们工程师的邮箱中都可以。
我已经给您的sina邮箱发信了,请您和我联系。(张)


助工
2008-04-07 14:05:52     打赏
8楼

请问sfr的定义文件是您自己编写的吗?
 请对比附件中由瑞萨官方发布的sfr定义文件和您使用的sfr定义文件。
 我发现您使用的sfr文件中的ad寄存器定义好象不太准确,
/*------------------------------------------------------
 A/D Register
------------------------------------------------------*/

union byte_def ad_addr;
#define ad ad_addr.byte

请修改为
#define  ad   ad_addr.word   /* A-D register  */

即,请将ad寄存器定义为word型,而不是byte型
sfr_r82l.rar


菜鸟
2008-04-07 14:57:52     打赏
9楼
已经好了。我已经试了,就是byte .word两者的区别。谢谢。

共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]