AD9850驱动程序--MSP430版本

发布者:科技徜徉最新更新时间:2017-11-03 来源: eefocus关键字:AD9850  驱动程序  MSP430 手机看文章 扫描二维码
随时随地手机看文章

前段时间忙着画板子搞运放搞滤波了,程序更新的少,发现MSP430不是太好用,尤其Timer,不过也与我使用内部晶振有关,产生正玄波之前用MSP430发出PWM,再进行滤波变为正弦波太麻烦了,这次改用DDS芯片,今天板子回来一会就调了出来很方便。


AD9850为一款DDS芯片,这里不做什么详细介绍了,有两种接口:serial 和 parrel,两种接口驱动均完成


 1 /*

 2  * AD9850.h

 3  *

 4  *  Created on: 2013-7-12

 5  *      Author: Allen

 6  */

 7 

 8 #ifndef AD9850_H_

 9 #define AD9850_H_

10 

11 #include    

12 #include    "MyType.h"

13 

14 

15 //----------------------------------------------------------------------------------

16 //AD9850:W_CLK P2.5

17 #define        AD9850_W_CLK_DIR            (P2DIR)

18 #define        AD9850_W_CLK_OUT            (P2OUT)

19 #define        AD9850_W_CLK_PIN_NUM        (BIT5)

20 

21 #define        AD9850_W_CLK_IO_INIT        (Set_Bit(P2DIR,AD9850_W_CLK_PIN_NUM))

22 #define        AD9850_W_CLK_H                (Set_Bit(P2OUT,AD9850_W_CLK_PIN_NUM))

23 #define        AD9850_W_CLK_L                (Clr_Bit(P2OUT,AD9850_W_CLK_PIN_NUM))

24 

25 //----------------------------------------------------------------------------------

26 //AD9850:FQ_UP P2.4

27 #define        AD9850_FQ_UP_DIR            (P2DIR)

28 #define        AD9850_FQ_UP_OUT            (P2OUT)

29 #define        AD9850_FQ_UP_PIN_NUM        (BIT4)

30 

31 #define        AD9850_FQ_UP_IO_INIT        (Set_Bit(P2DIR,AD9850_FQ_UP_PIN_NUM))

32 #define        AD9850_FQ_UP_H                (Set_Bit(P2OUT,AD9850_FQ_UP_PIN_NUM))

33 #define        AD9850_FQ_UP_L                (Clr_Bit(P2OUT,AD9850_FQ_UP_PIN_NUM))

34 

35 //----------------------------------------------------------------------------------

36 //AD9850:RESET P2.3

37 #define        AD9850_RESET_DIR            (P2DIR)

38 #define        AD9850_RESET_OUT            (P2OUT)

39 #define        AD9850_RESET_PIN_NUM        (BIT3)

40 

41 #define        AD9850_RESET_IO_INIT        (Set_Bit(P2DIR,AD9850_RESET_PIN_NUM))

42 #define        AD9850_RESET_H                (Set_Bit(P2OUT,AD9850_RESET_PIN_NUM))

43 #define        AD9850_RESET_L                (Clr_Bit(P2OUT,AD9850_RESET_PIN_NUM))

44 

45 //----------------------------------------------------------------------------------

46 //AD9850:BIT_DATA P1.7

47 #define        AD9850_BIT_DATA_DIR            (P1DIR)

48 #define        AD9850_BIT_DATA_OUT            (P1OUT)

49 #define        AD9850_BIT_DATA_PIN_NUM        (BIT7)

50 

51 #define        AD9850_BIT_DATA_IO_INIT        (Set_Bit(P1DIR,AD9850_BIT_DATA_PIN_NUM))

52 #define        AD9850_BIT_DATA_H            (Set_Bit(P1OUT,AD9850_BIT_DATA_PIN_NUM))

53 #define        AD9850_BIT_DATA_L            (Clr_Bit(P1OUT,AD9850_BIT_DATA_PIN_NUM))

54 

55 

56 extern void AD9850_INIT_SERIAL(void);

57 

58 extern void AD9850_RESET_SERIAL(void);

59 

60 extern void AD9850_WR_SERIAL(unsigned char w0,double frequence);

61 

62 extern void AD9850_INIT_PARREL(void);

63 

64 extern void AD9850_RESET_PARREL(void);

65 

66 extern void AD9850_WR_PARREL(unsigned char w0,double frequence);

67 

68 

69 #endif /* LED_H_ */


以上是头文件完成了pin定义与位操作,并口的数据线操作并没定义,到时候直接用port操作很方便,AD9850的D0-D7与MSP430的P1.0-P1.7对应,一次写入8位很简单。


其中使用了#include "MyType.h"中一些操作:


// C 

#define  Set_Bit(val, bitn)  (val |= (/*1 <<*/(bitn)))  

#define  Clr_Bit(val, bitn)  (val &= ~(/*1<<*/(bitn)))  

#define  Get_Bit(val, bitn)  (val & (1<<(bitn)) )


 

先写的串口的程序:


1 void AD9850_INIT_SERIAL(void)

2 {

3     AD9850_W_CLK_IO_INIT;

4     AD9850_FQ_UP_IO_INIT;

5     AD9850_RESET_IO_INIT;

6     AD9850_BIT_DATA_IO_INIT;

7 }


 1 void AD9850_RESET_SERIAL(void)

 2 {

 3     AD9850_W_CLK_L;

 4     AD9850_FQ_UP_L;

 5     //rest信号

 6     AD9850_RESET_L;

 7     AD9850_RESET_H;

 8     AD9850_RESET_L;

 9     //w_clk信号

10     AD9850_W_CLK_L;

11     AD9850_W_CLK_H;

12     AD9850_W_CLK_L;

13     //fq_up信号

14     AD9850_FQ_UP_L;

15     AD9850_FQ_UP_H;

16     AD9850_FQ_UP_L;

17 

18 }


 1 void AD9850_WR_SERIAL(unsigned char w0,double frequence)

 2 {

 3     unsigned char i,w;

 4     long int y;

 5     double x;

 6     //计算频率的HEX值

 7     x=4294967295/20;//适合125M晶振

 8     //如果时钟频率不为20MHZ,修改该处的频率值,单位MHz  !!!

 9     frequence=frequence/1000000;

10     frequence=frequence*x;

11     y=frequence;

12     //写w4数据

13     w=(y>>=0);

14     for(i=0;i<8;i++)

15     {

16 //       ad9850_bit_data=(w>>i)&0x01;

17        if((w>>i)&0x01)

18          AD9850_BIT_DATA_H;

19        else

20          AD9850_BIT_DATA_L;

21        AD9850_W_CLK_H;

22        AD9850_W_CLK_L;

23     }

24     //写w3数据

25     w=(y>>8);

26     for(i=0;i<8;i++)

27     {

28         if((w>>i)&0x01)

29           AD9850_BIT_DATA_H;

30         else

31           AD9850_BIT_DATA_L;

32         AD9850_W_CLK_H;

33         AD9850_W_CLK_L;

34     }

35     //写w2数据

36     w=(y>>16);

37     for(i=0;i<8;i++)

38     {

39         if((w>>i)&0x01)

40           AD9850_BIT_DATA_H;

41         else

42           AD9850_BIT_DATA_L;

43         AD9850_W_CLK_H;

44         AD9850_W_CLK_L;

45     }

46     //写w1数据

47     w=(y>>24);

48     for(i=0;i<8;i++)

49     {

50         if((w>>i)&0x01)

51           AD9850_BIT_DATA_H;

52         else

53           AD9850_BIT_DATA_L;

54         AD9850_W_CLK_H;

55         AD9850_W_CLK_L;

56     }

57     //写w0数据

58     w=w0;

59     for(i=0;i<8;i++)

60     {

61         if((w>>i)&0x01)

62           AD9850_BIT_DATA_H;

63         else

64           AD9850_BIT_DATA_L;

65         AD9850_W_CLK_H;

66         AD9850_W_CLK_L;

67     }

68     //移入始能

69     AD9850_FQ_UP_H;

70     AD9850_FQ_UP_L;

71 

72 }


串行连接时候需要注意pin2-4的连接:

 


以下是并行部分程序:


1 void AD9850_INIT_PARREL(void)

2 {

3     AD9850_W_CLK_IO_INIT;

4     AD9850_FQ_UP_IO_INIT;

5     AD9850_RESET_IO_INIT;

6     P1DIR=0xff;

8 }


1 void AD9850_RESET_PARREL(void)

2 {

3     AD9850_W_CLK_L;

4     AD9850_FQ_UP_L;

5     //rest信号

6     AD9850_RESET_L;

7     AD9850_RESET_H;

8     AD9850_RESET_L;

9 }


 AD9850_WR_PARREL


主函数:


 1 char mode=0; //0:serial   1:parrel

 2 /*

 3  * main.c

 4  */

 5 int main(void) {

 6     WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer

 7     

 8     mode=0;

 9 

10     if(mode==0)

11     {

12 

13         AD9850_INIT_SERIAL();

14         AD9850_RESET_SERIAL();

15         AD9850_WR_SERIAL(0,18000);

16     }

17     else if(mode==1)

18     {

19 

20         AD9850_INIT_PARREL();

21         AD9850_RESET_PARREL();

22         AD9850_WR_PARREL(0,25000);

23 

24     }

25 

26 

27 

28 

29 

30     while(1)

31     {

32 

33 

34     }

35     return 0;

36 }



关键字:AD9850  驱动程序  MSP430 引用地址:AD9850驱动程序--MSP430版本

上一篇:MSP430:实时时钟-DS1302
下一篇:MSP430:管脚的第二功能选择

推荐阅读最新更新时间:2024-03-16 15:42

基于MSP430F2012和nRF24L01的有源RFID标签的应用设计
  本文介绍了有源标签的设计理念出发,针对煤矿井下一般小范围空间RFID定位的需求,根据低功耗、高效率的原则进行RFID标签的设计。系统在硬件上采用了MSP430F2012单片机和nRF24L01射频芯片的低功耗组合;软件上则结合了RFID定位的特点,介绍了有别于一般以识别为主要目的的标签的设计方法,并分析了其软件设计流程以及简单的防冲突能力。通过良好匹配的天线,本设计有效读取距离可达几十米,足以应付一般空间内定位的需求。   1.引言   射频识别(RFID)技术是采用无线射频的方式实现双向数据交换并识别身份,RFID定位正是利用了这一识别特性,利用阅读器和标签之间的通信信号强度等参数进行空间的定位。   RFID标签按供电方
[单片机]
基于<font color='red'>MSP430</font>F2012和nRF24L01的有源RFID标签的应用设计
MSP430单片机I/O端口控制特点
与8031单片机相比,MSP430的I/O端口的功能要强大的多,其控制的方法也更为复杂。MSP430的I/O端口可以实现双向的输入、输出;完成一些特殊功能如:驱动LCD、A/D转换、捕获比较等;实现I/O各种中断。MSP430采用了传统的8位端口方式保证其兼容性,即每个I/O端口控制8个I/O引脚。为了实现对I/O端口每一个引脚的复杂控制,MSP430中的每个I/O口都对应一组8位的控制寄存器(如图1)。寄存器中的每一位对应一个I/O引脚,实现对该引脚的独立控制。寄存器的功能和数目是由该I/O口所能完成的功能以及类型确定的。 图1为MSP430的一个I/O端口的控制结构示意图。对于最基本的只能完成输入、输出功能的I/O端口其控制
[单片机]
MSP430 5xx/6xx系列 低频振荡器VLO编程实例(源码+电路)
MSP430 5xx/6xx系列内部VLO提供10 kHz的典型频率(参数见芯片的特定数据表),无需晶体。VLO为不需要精确时基的应用提供了一个低成本的超低功耗时钟源。 本实例示范如何使用VLO,并将其作为ACLK SMLK MCLK时钟来使用,通过将此三个时钟输出到特定的管脚,便于示波器测量验证。 工程介绍: MCU型号: MSP430F6736A 编译平台: IAR for MSP430 6.40.1 实验项目: 测试 MCU 内部时钟 VLOCLK (内部极低功率, 低频振荡器, 典型频率为10 kHz) 选择 VLOCLK 作为 ACLK SMCLK MCLK, 并将 ACLK SMCLK MCLK 输
[单片机]
<font color='red'>MSP430</font> 5xx/6xx系列 低频振荡器VLO编程实例(源码+电路)
MSP430学习笔记10-ADC采集1602显示
同样是开发板中的例程,对关键的地方做了说明,程序如下: /********************************************************* 程序注意点: 首先可以选择是否开启内部参考电压还是使用外部参考电压 每个通道可以独立选择参考电压 如果连接了外部参考电压应该注意关闭内部参考电压防止损坏 单片机 程序功能:MCU的片内ADC对P6.0端口的电压进行转换 将模拟电压值显示在1602液晶上。 ---------------------------------------------------------- 拨码开关设置:将LCD位拨至ON,其余位拨至OF
[单片机]
基于AD9850的嵌入式信号源设计与实现
0 引 言 信号源是现代电子系统的重要组成部分,在通信、测控、导航、雷达、医疗等领域有着广泛的应用,而且信号源作为现代电子产品设计和生产中的重要工具,必须满足高精度、高速度、高分辨率、频率可调等要求。传统的RC或LC自激振荡器方式的信号源组成较繁杂,调试较困难,不易实现程控,已不能适应新的要求;而由采用专用IC芯片构成的信号发生器,例如使用MAX038或ICL8038集成芯片外接分立元件,通过调节外接电容或电阻来设置输出信号频率,其输出信号受外部分立器件参数的影响很大,且输出信号频率不能太高,同时无法实现频率步进调节,不便于扩展和较高的使用要求。另外,采用FPGA+D/A可实现正弦信号发生器的设计,同时可实现频率步进调节;但当输
[测试测量]
MSP430--通用IO端口
IO端口是单片机最常用的外设模块,由于单片机的总线不对外开放,所以单片机和外部进行信息交流的桥梁就是数字IO端口。 目前,MSP430系列单片机当中有端口P1,P2,P3,P4,P5,P6等端口,其中P1,P2的每一位都有中断功能,但不是独立的,P1口每位共用PORT1_VECTOR中断向量,P2共用PORT2_VECTOR向量。 P1--P6端口大多数是复用的,具有第二功能可以通过PxSEL选择是普通IO口或者第二功能。 1.端口的寄存器: (1)P1-P2端口具有中断能力,共7个寄存器 PxIN输入寄存器,只读寄存器,即只能读取输入端口x的数据; PxOUT输出寄存器,可读可写,即可以向
[单片机]
用类/微驱动模型开发DSP视频驱动程序
  近年来,DSP运算能力的不断增强,使其在电子设备方面得到了广泛的应用。DSP/BIOS是TI公司推出的一个实时操作系统,与TI的CCS(Code Composer Studio)集成在一起。用DSP/BIOS可以大大简化DSP应用程序的开发和调试,其中与外围设备的I/O接口是DSP应用开发中不可缺少的重要部分。TI公司为C64x系列DSP的开发者提供了一种类/微驱动模型(class/mini drivermodel)。通过对外围设备设计驱动程序,为高层应用程序提供统一的接口来操作底层硬件。只要是遵循此驱动程序接口标准开发的高层应用程序,都可以在具有相同接口的不同硬件平台上运行,从而使DSP软件系统与硬件系统相分离,提高了软件的
[嵌入式]
MSP430复位电路
该复位电路的中二极管的主要作用是:当供电突然断掉时,给电容C提供快速泄流通道,从而保证在下次上电前VCC地域MSP430复位要求的电压。
[单片机]
<font color='red'>MSP430</font>复位电路
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved