×
嵌入式 > 技术百科 > 详情

TLC5620产生频率可调三相正弦信号

发布时间:2020-06-15 发布时间:
|
/*********************************************************/
//一般说明
//TLC5620 串行通信
//定时器控制其3路正弦波输出频率
/*********************************************************/
#include //用于调试子程序

/*********************************************************/
//TLC5620的核心子程序
/*********************************************************/
#define uint unsigned int
#define uchar unsigned char
#define STC5620_A 0     //通道A,增益0  由于先写高位所以已经做过左移5位处理
#define STC5620_B 64     //通道B,增益0
#define STC5620_C 128     //通道B,增益0
sbit STC5620_LDAC=P3^2;    //定义TLC5620与单片机的接口
sbit STC5620_LOAD=P3^3;
sbit STC5620_CLK=P3^5;
sbit STC5620_DATA=P3^4;
uchar code DAC_SIN[100]={128,136,144,152,160,168,175,182,190,197,
        203,210,216,221,227,232,236,240,244,247,
        250,252,254,255,255,255,255,255,254,252,
        250,247,244,240,236,232,227,221,216,210,
        203,197,190,182,175,168,160,152,144,136,
        128,120,112,104,96, 88, 81, 74, 66, 59,
        53, 46, 40, 35, 29, 24, 20, 16, 12, 9,
         6, 4,  2,  1,  0,  0,  0,  1,  2,  4,
         6, 9,  12, 16, 20, 24, 29, 35, 40, 46,
        53, 59, 66, 74, 81, 88, 96, 104,112,120,        
      };         //对正弦波采100个样点
void STC5620_write_com(uchar channel,uchar vol)      // 选通道,写输出电压命令
{              
uchar i;
STC5620_LDAC=1;
STC5620_LOAD=1;             //总线拉高准备写入
for(i=0;i<3;i++)             //写入选择通道命令,其中默认了增益为1
{

STC5620_DATA=(bit)(channel&0x80);
STC5620_CLK=1;             //下降沿锁存数据
STC5620_CLK=0;
channel<<=1 ; 
}
for(i=0;i<8;i++)             //写入输出电压命令
{

STC5620_DATA=(bit)(vol&0x80);
STC5620_CLK=1;             //下降写数据入串口缓冲器
STC5620_CLK=0;
vol<<=1; 
}
STC5620_LOAD=0;             //下降沿写串口缓冲器入通道指定的中间缓冲器
STC5620_LDAC=0;             //下降沿写中间缓冲器入通道对应的输出缓冲器
}
void STC5620_sin(void)
{
static uchar ii=0,jj=33,kk=66;         //总点数为100个点,可以用于设定相位差
               //定义静态变量 每次更新上次值
{
STC5620_write_com(STC5620_A,DAC_SIN[ii]);
  ii=ii+2;             //控制通道A采样点数
if(ii>99) ii=0;
STC5620_write_com(STC5620_B,DAC_SIN[jj]);
jj=jj+2;             //控制通道B采样点数
if(jj>99) jj=0;
STC5620_write_com(STC5620_C,DAC_SIN[kk]);
kk=kk+2;               //控制通道C采样点数
if(kk>99) kk=0;
}
}
/*********************************************************/
//设置定时中断控制TLC5620输出正弦波的频率
/*********************************************************/
void Init_T0(void)
{
EA=1;
ET0=1;
TMOD=0x02;    //自动装载计数
TR0=1;
TL0=TH0=256-90;    //设置频率  具体使用时计算出参数后再幅值
       //频率计算公式a:计数个数;p:晶振频率;b:取样点数;则在单片机12分频工作模式情况下频率=p/(12ab)
       //此时频率为
}

void time0() interrupt 1
{
STC5620_sin();
}

/*********************************************************/
//主函数
/*********************************************************/
void main()
{
Init_T0();      //初始化定时器
while(1);       //等待中断
}
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分拣机器人的工作原理是什么