在线时间14 小时
UID3083150
注册时间2016-8-12
NXP金币0
该用户从未签到
注册会员
- 积分
- 142
- 最后登录
- 2022-1-3
|
项目需要用到DDS芯片产生可调频的高精度正弦信号,
ad9833驱动比较简单,只需要3个IO即可,片选、数据、时钟,这里我使用PIO0_11作为时钟,PIO0_12作为数据、PIO0_14作为片选。采用模拟SPI方式。
- #include "app_ad9833.h"
- #include "app_ioctl.h"
- #define AD9833_SYSTEM_CLOCK 25000000UL
- #define FSYNC_0() do {gpio_out_low(0,12);} while(0)
- #define FSYNC_1() do {gpio_out_high(0,12);} while(0)
- #define SCLK_0() do {gpio_out_low(0,11);} while(0)
- #define SCLK_1() do {gpio_out_high(0,11);} while(0)
- #define SDATA_0() do {gpio_out_low(0,14);} while(0)
- #define SDATA_1() do {gpio_out_high(0,14);} while(0)
- void ad9833_init(void)
- {
- gpio_out_init(0,12,1);//ss
- gpio_out_init(0,14,0);//data
- gpio_out_init(0,11,0);//sck
- }
- void AD9833_Write_16Bits(uint16_t _cmd)
- {
- uint8_t i;
- SCLK_1();
- FSYNC_0();
-
- for(i = 0; i < 16; i++)
- {
- if (_cmd & 0x8000)
- {
- SDATA_1();
- }
- else
- {
- SDATA_0();
- }
- SCLK_0();
- _cmd <<= 1;
- SCLK_1();
- }
-
- FSYNC_1();
- }
- /*
- *********************************************************************************************************
- * 函数名:AD9833_SelectWave
- * 功能说明:软件位控制
- * IOUT正弦波 ,SIGNBITOUT方波 ,写FREQREG0 ,写PHASE0
- * ad9833_write_16bit(0x2028) 一次性写FREQREG0
- * ad9833_write_16bit(0x0038) 单独改写FREQREG0的LSB
- * ad9833_write_16bit(0x1038) 单独改写FREQREG0的MSB
-
- * IOUT三角波 ,写PHASE0
- * ad9833_write_16bit(0x2002)一次性写FREQREG0
- * ad9833_write_16bit(0x0002)单独改写FREQREG0的LSB
- * ad9833_write_16bit(0x1008)单独改写FREQREG0的MSB
- * 形参:_Type -- 波形类型
- * 返回值 :无
- *********************************************************************************************************
- */
- void AD9833_SelectWave(uint8_t _Type)
- {
- FSYNC_1(); //宏定义
- SCLK_1();
- if(_Type == 0)
- {
- AD9833_Write_16Bits(0x2028); /*频率寄存器输出方波*/
- }
- else if(_Type == 1)
- {
- AD9833_Write_16Bits(0x2002); /*频率寄存器输出三角波*/
- }
- else if(_Type == 2)
- {
- AD9833_Write_16Bits(0x2000); /*频率寄存器输出正弦波*/
- }
- else if(_Type == 3)
- {
- AD9833_Write_16Bits(0x00C0); /*无输出*/
- }
-
- }
- /****************************************************************
- 函数名称: AD9833_SetFreq
- 功能: 设置频率值
- 参数: _freq
- freq -- 频率值 (Freq_value(value)=Freq_data(data)*FCLK/2^28)
- 返回值: 无
- *****************************************************************/
- void AD9833_SetFreq(uint32_t _freq)
- {
- uint32_t freq;
- uint16_t lsb_14bit;
- uint16_t msb_14bit;
- uint8_t freq_number = 0;
- freq = (uint32_t)(268435456.0 / AD9833_SYSTEM_CLOCK * _freq);
- lsb_14bit = (uint16_t)freq;
- msb_14bit = (uint16_t)(freq >> 14);
- if(freq_number == FREQ_0)
- {
- lsb_14bit &= ~(1U<<15);
- lsb_14bit |= 1<<14;
- msb_14bit &= ~(1U<<15);
- msb_14bit |= 1<<14;
- }
- else
- {
- lsb_14bit &= ~(1<<14);
- lsb_14bit |= 1U<<15;
- msb_14bit &= ~(1<<14);
- msb_14bit |= 1U<<15;
- }
- AD9833_Write_16Bits(lsb_14bit);
- AD9833_Write_16Bits(msb_14bit);
- }
复制代码
附上工程:
LPC54114-AD9833.zip
(1.08 MB, 下载次数: 20)
|
|