当前位置: 代码迷 >> 单片机 >> 求关于CS5460电机测量的解决方法
  详细解决方案

求关于CS5460电机测量的解决方法

热度:31   发布时间:2016-04-28 15:47:54.0
求关于CS5460电机测量的解决办法
#include "reg52.h"
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit Cs5460_clk =P2^3;
sbit Cs5460_cs =P2^1;
sbit Cs5460_sdi =P2^4;
sbit Cs5460_RET =P2^0;
sbit Cs5460_sdo =P2^2;

uchar buff[4],buff2[4],Irms,Vrms; //功率暂存器

void delay(uchar us)
{
for(;us>0;us--)
_nop_();
}

void InitZD( void ) 

TMOD=0x21;
TH1=0xfd;
TL1=0Xfd;
TR1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

//向串口发送一个字符 
void send_char(unsigned char ch) 

SBUF=ch; 
while (TI==0); 
TI=0; 


void Write_Cs5460_Byte(uchar temp)
{
uchar i;
Cs5460_clk=0;
for(i=0;i<8;i++) //循环8次,写入数据
{
Cs5460_clk=0;
Cs5460_sdi=(temp&0x80)>>7; //每次传输高字节
temp<<=1;
Cs5460_clk=1;
}
Cs5460_clk=0;
}

void Write_Cs5460(uchar *buff,uchar n)
{
uchar i;
Cs5460_cs=1;
delay(10);
Cs5460_clk=0;
delay(10);
Cs5460_cs=0;
delay(10);
for(i=0;i<n;i++)
{
Write_Cs5460_Byte(*(buff+i));
}
Cs5460_clk=0;
Cs5460_sdi=0;
Cs5460_cs=1;
}

uchar Read_Cs5460_Byte()
{
uchar i,tmp=0;
for(i=0;i<8;i++)
{
Cs5460_clk=0;
delay(2);
Cs5460_clk=1;
if(Cs5460_sdo) tmp|=0x01;tmp<<=1;
}
return tmp;
}

void Read_Cs5460(uchar address,uchar *buff)
{
uchar i;
Cs5460_cs=1;
delay(10);
Cs5460_clk=0;
delay(10);
Cs5460_cs=0;
delay(10);
Write_Cs5460_Byte(address);
Cs5460_sdi=1;
for(i=0;i<3;i++)
{
*(buff+i)=Read_Cs5460_Byte();
}
Cs5460_clk=0;
Cs5460_sdi=0;
Cs5460_cs=1;
}

void Init_Cs5460()
{
uchar buff[4];
Cs5460_RET=0;
delay(30000); //30ms
Cs5460_RET=1;
buff[0]=0xff; //SYNC1
buff[1]=0xff; //SYNC1
buff[2]=0xff; //SYNC1
buff[3]=0xfe; //SYNC0
Write_Cs5460(buff,4); //写同步
buff[0]=0x40; //写配置寄存器
buff[1]=0x01; //GI=1,电流通道增益=10
buff[2]=0x18; //中断形式:00高电平,08低电平,10下降沿,18上升沿
buff[3]=0x01; //DCLK=MCLK/1
Write_Cs5460(buff,4);
buff[0]=0x5e; //SYNC1
buff[1]=0xff; //SYNC1
buff[2]=0xff; //SYNC1
buff[3]=0xff; //SYNC0
Write_Cs5460(buff,4); //清状态寄存器
buff[0]=0x74;
buff[1]=0xff;
buff[2]=0xff;
buff[3]=0xff;
Write_Cs5460(buff,4); //写屏蔽中断寄存器
buff[0]=0x78;
buff[1]=0x00;
buff[2]=0x00;
buff[3]=0x00;
Write_Cs5460(buff,4); //写控制寄存器
buff[0]=0x4c;
buff[1]=0x00;
buff[2]=0x34;
buff[3]=0x9c;
Write_Cs5460(buff,4); //写EOUT脉冲输出寄存器
buff[0]=0x4a;
buff[1]=0x00;
buff[2]=0x01;
buff[3]=0x90;
Write_Cs5460(buff,4); //写CYCLE COUNT寄存器
buff[0]=0x44; //SYNC1
buff[1]=0x40; //SYNC1
buff[2]=0x00; //SYNC1
buff[3]=0x00; //SYNC0
Write_Cs5460(buff,4); //写电流增益寄存器
buff[0]=0x48;
buff[1]=0x40; //增益1
buff[2]=0x00;
buff[3]=0x00;
Write_Cs5460(buff,4); //写电压增益寄存器
Read_Cs5460(0x1e,buff2); //读状态寄存器
buff[3]=buff[2];
buff[2]=buff[1];
buff[1]=buff[0];
buff[0]=0x5e;
Write_Cs5460(buff,4); //写状态寄存器
buff[0]=0xe8;
Write_Cs5460(buff,1); //启动Cs5460,执行连续周期计算
}

void main()
{
Init_Cs5460();
InitZD();
while(1)
{
buff[0]=0x40;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x01;
Write_Cs5460(buff,4);
Read_Cs5460(0x00,buff);
Vrms=buff[0];
send_char(Vrms);
}
}

void timer() interrupt 1
{
TR0=0;

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
  相关解决方案