EDN首页   博客首页

最新日志

发表于:2008-10-11 8:55:06
标签:单片机  DDS  AD9833  控制  

0

DDS AD9833 的单片机控制

DDS,即数字直接合成,产生各种波形。DDS芯片有很多,比较常用的是AD公司的AD9833。
电路如下:
点击看大图
其中:
    FCS  片选信号
    SCLK 数据传输时钟
    SDA  数据线
    MCLK 芯片主频,接一个25M的晶振模块

控制程序如下:
环境:
    Keil C 8.02
    C8051F020 @ 20M


//代码
sbit FCS1 = P3^1;
sbit SCL  = P3^4;
sbit SDA  = P3^5;


#define B28  0x2000      //complete word or two seperate byte
#define HLB  0x1000      //H/L Byte sequience input
#define FSEL 0x0800      //Freq0 or Freq1
#define PSEL 0x0400      //Phase0 or Phase1
#define REST 0x0100      //1: Reset
#define SLP1 0x0080      //1: Internal MCLK Disable
#define SLP2 0x0040      //1: PowerDown Onchip DAC
#define OPBITEN 0x0020   //VOUT connect to MSB/2
#define DIV2 0x0004      //when opbiten,
#define MODE 0x0002      //

#define ASTR  0x0000
#define AFREQ0 0x4000
#define AFREQ1 0x8000
#define APHS0  0xD000
#define APHS1  0xF000

void spi_delay(unsigned int n)
{
    unsigned int i,j = n*10;
    for(i=0; i<j; i++){_nop_();};
}

void spi_initialize()
{
    unsigned char i,j;

    WDTCN     = 0xDE;
    WDTCN     = 0xAD;

    XBR0 = 0x05;
    XBR2      = 0x40;

    P3MDOUT   = 0xFF;
    P3 = 0xFF;

    return;
}

void spi_sendword(unsigned int wData)
{
    unsigned int bitTest=wData;
    unsigned char i;

    SCL = 1;
    SDA = 1;
    FCS1 = 1;
    spi_delay(10);

    FCS1 = 0;
    spi_delay(5);

    for(i=0; i<16; i++)
    {
        if((bitTest & 0x8000))
            {
                SDA = 1;
            }
        else
            {
                SDA = 0;
            }
       
        SCL = 0;
        spi_delay(5);
        SCL = 1;
        spi_delay(4);
        bitTest <<= 1;
    }
    spi_delay(2);
    FCS1 = 1;
    spi_delay(2);
    SCL = 1;

    return;
}


void main()
{
    unsigned int a,b;

    spi_initialize();
   
    //初始化,所有寄存器清零
    spi_sendword(ASTR | B28 | REST);
    spi_sendword(AFREQ0 | 0);
    spi_sendword(AFREQ0 | 0);
    spi_sendword(ASTR   | B28 |REST | FSEL);
    spi_sendword(AFREQ1 | 0);
    spi_sendword(AFREQ1 | 0);
    spi_sendword(APHS0  | 0);
    spi_sendword(APHS1  | 0);


    //产生正弦波;先写指令寄存器,后写频率寄存器;高14位在前,低14位在后
    spi_sendword(ASTR   | B28);
    spi_sendword(AFREQ0 | 0x49B);     //200k sine wave
    spi_sendword(AFREQ0 | 0x83);

    while(1)
    {
        _nop_();
    }
}

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(127)
发表于:2008-6-1 8:54:44
标签:IIC  C8051F020  24C16  

1

C8051F020读写24C16

说明

本程序是C8051F020,查询方式读写24C16的程序;阅读本文这前,最好熟悉一下C8051F020端口配置、SMBUSIIC、及24C16的相关资料和文档。

 

电路

点击看大图


 

//代码 使用 Keil C V8.02

#include "C8051F020.h"

 

#define IICDEVSEL          0xA0

#define IICWRITE              0

#define IICREAD               1

 

sbit IIC_WP = P3^0;

 

/*

 * C8051F020SMBUS初始化配置、端口配置

 */

void IIC_Init()

{

       //

       SMB0CR = 0x40;

       return ;

}

 

/*

 * C8051F020SMBUS总线使能控制

 */

void IIC_BusEnable(unsigned char enable)

{

if(enable)

{

    //SMBUS 总线使能

              SMB0CN |= 0x40;

}

else

{

    //SMBUS 总线不使能

              SMB0CN &= 0xBF;

}

}

 

/*

 * 24C16写地址

 */

char IIC_WriteAddress(unsigned int addr)

{

       unsigned char xdata temp;

 

       //产生START状态

       STA = 1;

      

       while(1)

       {

              switch (SMB0STA)

              {

                     case: 0xF8:

                               break;

                     case 0x08:

                            //取出地址的8~10位,合并到器件选择命令字节中

                            temp = (unsigned char)(addr>>8);

                            temp &= 0x07;

                            temp <<= 1;

                            SMB0DAT = IICDEVSEL | IICWRITE | temp;

                            STA = 0;

                            SI = 0;

                            break;

                     case 0x18:

                            //发送低8位地址

                            SMB0DAT = (unsigned char)(addr);

                            STA = 0;

                            SI = 0;

                            break;

                     case 0x28:

                            //地址发送正确的完成

                            return 0;

                            break;

                     default:

                            //地址发送错误

                            STO = 1;

                            SI = 0;

for(i=0; i<3; i++); //delay for stop state transmitted

                            return -1;

                            break;

              }

       }

}

 

/*

 * 24C16写数据

 */

char IIC_Write(unsigned char len, unsigned char* buffer)

{

       unsigned char xdata i;//

      

       i = 0;

       while(1)

       {

              switch (SMB0STA)

              {

                     case: 0xF8:

                                break;

                     case 0x28:

                            if(i

                            {

                                   SMB0DAT = *buffer;

                                   buffer++;

                                   i++;

                                   SI = 0;

                            }

                            else

                            {

                                   STO = 1;

                                   SI = 0;

                                   for(i=0; i<3; i++); //delay for stop state transmitted

                                return 0;

                            }

                            break;

                     default:

                            STO = 1;

                            SI = 0;

                            for(i=0; i<3; i++); //delay for stop state transmitted

                            return -1;

                            break;

                     }

              }

       return 0;

}

 

/*

 * 24C16中读数据

 */

unsigned char IIC_Read(unsigned char len, unsigned char* buffer)

{

       unsigned char xdata i;

      

       i = 0;

      

       //iic repeat start

       STA = 1;

       SI = 0;

       while(1)

       {

              switch (SMB0STA)

              {

                     case: 0xF8:

                             break;

                     case 0x10:

                            SMB0DAT = IICDEVSEL | IICREAD;

                            STA = 0;

                            SI = 0;

                            break;

                     case 0x40:

                            i++;

                            if(i == len)

                            {

                                   //如果是最后一个字节,则发送NOACK

                                   AA = 0;

                            }

                            else

                            {

                                   //发送ACK

                                   AA = 1;

                            }

                            SI = 0;

                            break;

                     case 0x50:

                            *buffer = SMB0DAT;

                            buffer++;

                            i++;

                            if(i == len)

                            {

                                    //如果是最后一个字节,发送NOACK

                                   AA = 0;

                            }

                            else

                            {

                                   //发关ACK

                                   AA = 1;

                            }

                            SI = 0;

                            break;

                     case 0x58:

                            *buffer = SMB0DAT;

                            STO = 1;

                            SI = 0;

for(i=0; i<3; i++); //delay for stop state transmitted

                            return 0;

                            break;

                     default:

                            STO = 1;

                            SI = 0;

for(i=0; i<3; i++); //delay for stop state transmitted

                            return -1;

                            break;

              }

       }

       return 0;

}

 

/*

 * 测试程序

 */

unsigned char sendbuf[]={1,2,3,4,5,6,7,8};

unsigned char revbuf[8];

void main(void)

{

IIC_Init();

 

IIC_BusEnable(1);

 

IIC_WriteAddress(0x100);

IIC_Write(8,sendbuf);

 

IIC_WriteAddress(0x100);

IIC_Read(8,revbuf);

 

while(1);

}

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(135)
发表于:2008-5-30 12:39:38
标签:无标签

0

纺织机械控制器


项目背景

    纺织机械按结构大致可以分为两大类:横机与圆机。按用途来分,又可分为织布机、羊毛衫机、手套机、袜机等。本项目所要研发的控制器,即是针对手套机的控制器。

手套机历史

    手套机历史悠久,最早可以追朔到1948年。在著名的纺织国度意大利,一家名叫普罗蒂的公司,最早发明出了全机械的手套机。经过了十多年的风雨历程,它也从机械式的丑小鸭到全电脑自动控制的小天鹅般的变化。


纯机械式手套机


简单电脑控制


全电脑控制

立项依据

    国内手套机的发展阶段,仍处于简单电子控制阶段。这个阶段机型的特征是:

    (1)机器动力源为一个变频控制电器,通过变速机构传递到主轴上,及其他执行机构上。导致机械结构相当复杂,故障率高;

    (2)通过针鼓,对手套纺织进行编程;因为针鼓是机械结构,所以这样的编程方式局限性很大,且很不方便;

    (3)只能织单色手套,不能提花;目前市场上单色手套的利润远低于提花手套的利润,这是手套生产厂家准备换代的一个重要原因。


方案选择


    根据初步调查,目前国内有多家企业在研发下一代的手套机控制器。实现方案大致分两类:

    被动控制式:机械主体结构与简单电子控制式大体相同,对机器上的重要部件编织头进行了改进,使它具备提花的能力。因为该方案中,控制器不能控制编织头的位置,反而是根据编织头的位置,来执行相应的动作,所以称为被动式控制。

    它的优点是,机械改动小,上一代机器的设计、工艺和生产管理等基本兼容,可以最大限度的利用,有效降低了研发成本与风险。缺点主要是,机械结构太复杂,导致故障率高。

    主动控制式:采用多个伺服电机替代了原先的变频器,及传动机构。使得机器的机械结构上大大简化。由于控制器可以精确控制编织头的位置,给编织工艺设计带来很大的方便。

    它的优点是,机械结构简单,编织工艺控制方便。缺点是成本较高,控制系统结构较复杂。


总体方案


    经过论证,在主动控制式的控制平台上,是可以实现被动控制的。所以,研发初期阶段以通用平台为主,兼顾主动与被动控制两种方案。产品化时,针对被动控制进行简化,以降低生产成本。

    项目总体方案分为三个层次:

    一:纺织CAD

    为方便用户使用,本项目贯彻所见即所得的设计理念。即用户在电脑上画出什么样的手套,最终就会在机器上织出什么样的手套。纺织CAD层提供了直观、方便的界面,供专心用户去实现他的手套设计;

    而CAD层的背后,则是将用户的手套设计图样,翻译成工艺控制编码,控制机器实现手套编织。

    二:工艺控制层

    手套编织包含两个方面的工作:编织工艺与机械动作控制。编织工艺指手套编织时,每个机械零件的动作顺序。机械动作控制,指某个机械零件动作的实现过程。在与客户交流的过程中,我们发现了这样的现象:精通编织工艺的工程师,往往对机械设计不熟悉;而对机械设计熟悉的工程师,又往往对编织工艺一窍不通。在我们的开发团队中,也是如此。

    基于这个原因,我们将所面对的这个混乱工程一分为二:工艺控制层由工艺软件设计工程师负责,根据手套编织过程,确定一套编指令集。每个手套的编织,都可以通过调用这套编织指令集实现(CAD层就是将设计图样,翻译成指令程序)。每个指令,又是一个或几个动作的组合。

    工艺控制层的工作就是,将工艺控制命令,转换成动作控制命令。

    三:动作控制层

    动作控制层就负责精确控制各个可动零部件。提供单独的控制命令,控制单一的可动部件,而部件动作的组合,则由工艺层来完成。

    这样,动作控制层设计基本上可以不考虑手套工艺问题,而手套工艺控制,也基本上不用关心下层是如何实现的。

项目层次图


项目实现


    纺织CAD层:以PCWindows为平台,Visual C++为编程工具。实现普通手套、平指、元宝手套等版式,及手套上各种花型图案的设计。以文件为形式,U盘为载体实现CAD层与工艺层的数据交换。

    工艺控制层:以ARMLinux为平台,QT为开发工具,640*480大屏幕为用户显示界面。采用S3C2410为处理器、200M主频、32M SDRAM64M NAND FLASHVGA显示,完全而流畅的完成各种控制任务。工艺层与动作层之间采用专用的数据总线,实现数据交换。

    动作控制层:以DSP为平台,实现对各种机械的控制任务。采用TI C5402 DSP处理器,并用EPM3512 CPLDIO端口扩展。实现四路伺服位置控制环(编码器反馈)、50路大功率数字输出、16路数字输入。


总结


    目前,国内手套机高端市场,仍然由意大利、日本、韩国等产品占据,国内产品基本上是空白。令人欣慰的是,国内有不少厂家正在努力的开发,有的已经推出了较稳定的产品,相信不久的将来,这种状况会改变。

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(1) | 阅读(108)
总共 , 当前 /