现在用28035的芯片写了一个SPWM的调制程序,我的中断的频率给定是20kHz,现在要做多相相位控制的正弦波发生,我想用一个芯片给另一个芯片发送正弦数值,我把发送的语句写在20kHz的中断里,想让他发送的频率也是20kHz,下面是在中断中CAN发送语句:
ECanaMboxes.MBOX25.MDH.all = M;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS25 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA25 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
但是我现在发现CAN发送芯片的中断频率降低了3倍,就是上面这个发送语句要执行的时间很长,我用GPIO端口看了一下,大约有140us,观看中断时间GPIO端口波形如下所示:
我现在是觉得这个发送的时间太长了,导致了中断频率变成了6.67kHz,成了原来一三分之一,请大家看一下这样的执行时间正常吗?为什么会这样?还有CAN通讯可以实现每50us发一次数据吗(也就是20kHz)?
感激不尽!
Jun Zhang10:
兄台的想法有些奇特,先不说你计算过没有一个CAN帧的传输时间多长,看你在中断中都敢不戴套的do/while,你想过没有如果你的while条件一直不成立会有什么结果?
现在用28035的芯片写了一个SPWM的调制程序,我的中断的频率给定是20kHz,现在要做多相相位控制的正弦波发生,我想用一个芯片给另一个芯片发送正弦数值,我把发送的语句写在20kHz的中断里,想让他发送的频率也是20kHz,下面是在中断中CAN发送语句:
ECanaMboxes.MBOX25.MDH.all = M;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS25 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA25 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
但是我现在发现CAN发送芯片的中断频率降低了3倍,就是上面这个发送语句要执行的时间很长,我用GPIO端口看了一下,大约有140us,观看中断时间GPIO端口波形如下所示:
我现在是觉得这个发送的时间太长了,导致了中断频率变成了6.67kHz,成了原来一三分之一,请大家看一下这样的执行时间正常吗?为什么会这样?还有CAN通讯可以实现每50us发一次数据吗(也就是20kHz)?
感激不尽!
user4884320:
回复 Jun Zhang10:
感谢您的回答,请问一下什么叫做不戴套的dowhile?如果while一直不成立的话应该是会导致程序死在中断里。
我之前做过一个没有通讯的,两套逆变器的输出频率有一些不同导致相位不固定,我当时想的是可能两芯片的系统时钟因为外部电路的原因导致不相同,才导致输出频率有少许不同,所以想用发送中断中的数据到接收芯片中,用CAN中断运行,这样就保证两芯片程序的中断频率是一样的了,但是您也说这样的做法好像不常见,能给一些建议吗?
还有一个问题是,就是我现在把 BRPreg=1,SEG1reg=2,SEG2reg=1,。这样是不是把波特率改成2.5Mbps了,按照计算好像是这样的,确实也可以通讯,但是为什么我查资料都在说CAN通讯的最快速度就是1Mbps呢?
现在用28035的芯片写了一个SPWM的调制程序,我的中断的频率给定是20kHz,现在要做多相相位控制的正弦波发生,我想用一个芯片给另一个芯片发送正弦数值,我把发送的语句写在20kHz的中断里,想让他发送的频率也是20kHz,下面是在中断中CAN发送语句:
ECanaMboxes.MBOX25.MDH.all = M;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS25 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA25 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
但是我现在发现CAN发送芯片的中断频率降低了3倍,就是上面这个发送语句要执行的时间很长,我用GPIO端口看了一下,大约有140us,观看中断时间GPIO端口波形如下所示:
我现在是觉得这个发送的时间太长了,导致了中断频率变成了6.67kHz,成了原来一三分之一,请大家看一下这样的执行时间正常吗?为什么会这样?还有CAN通讯可以实现每50us发一次数据吗(也就是20kHz)?
感激不尽!
user4884320:
回复 Jun Zhang10:
感谢回答。
我现在是在做三相组合式的逆变器,要保持各相之间相差120度,暂时是三个芯片独立控制,这个也是需要锁相环的是吗?
现在用28035的芯片写了一个SPWM的调制程序,我的中断的频率给定是20kHz,现在要做多相相位控制的正弦波发生,我想用一个芯片给另一个芯片发送正弦数值,我把发送的语句写在20kHz的中断里,想让他发送的频率也是20kHz,下面是在中断中CAN发送语句:
ECanaMboxes.MBOX25.MDH.all = M;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS25 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA25 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
但是我现在发现CAN发送芯片的中断频率降低了3倍,就是上面这个发送语句要执行的时间很长,我用GPIO端口看了一下,大约有140us,观看中断时间GPIO端口波形如下所示:
我现在是觉得这个发送的时间太长了,导致了中断频率变成了6.67kHz,成了原来一三分之一,请大家看一下这样的执行时间正常吗?为什么会这样?还有CAN通讯可以实现每50us发一次数据吗(也就是20kHz)?
感激不尽!
user4884320:
回复 Jun Zhang10:
还有我刚看了TI 230CAN收发器的数据手册,上面写着速度可达1Mbps,但是我在程序中给定已经到了2.5Mbps,竟然也可以通讯,这样使用会有什么后果?