专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
DDS芯片 AD9833正弦波 顶部略微有些畸形 江湖救急大神们··
2019-12-12 18:15
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
6204
27
28
本帖最后由 射天狼 于 2019-3-24 16:10 编辑
做了一批DDS的板子,同一批次的PCB 元器件也都是 程序也都一样 测量方法也一样
弄了50个左右 啥样的都有
总结分了三类情况
波形几乎完全无失真 A类
波形毛刺多 B类
波形有明显凹陷失真 C类
自己找过问题 没找到
1.拿A类的AD9833换到C类上面 C类板子还是那样没任何改变
做了这么多呐
原理图和PCB
SINLE.jpg
(506.89 KB, 下载次数: 0)
下载附件
2019-3-24 15:53 上传
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
27条回答
射天狼
2019-12-13 19:41
wye11083 发表于 2019-3-24 21:31
是不是正弦表写的不对?你好好查查写入时序。它不是标准iic。
代码如下
/*
*********************************************************************************************************
* 函 数 名: AD9833_WaveSeting
* 功能说明: 向SPI总线发送16个bit数据
* 形 参: 1.Freq: 频率值, 0.1 hz - 12Mhz
2.Freq_SFR: 0 或 1
3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
4.Phase : 波形的初相位
* 返 回 值: 无
*********************************************************************************************************
*/
void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
{
int frequence_LSB,frequence_MSB,Phs_data;
double frequence_mid,frequence_DATA;
long int frequence_hex;
/*********************************计算频率的16进制值***********************************/
frequence_mid=268435456/25;//适合25M晶振
//如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
frequence_DATA=Freq;
frequence_DATA=frequence_DATA/1000000;
frequence_DATA=frequence_DATA*frequence_mid;
frequence_hex=frequence_DATA; //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
Phs_data=Phase|0xC000; //相位值
AD9833_Write(0x0100); //复位AD9833,即RESET位为1
AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1
if(Freq_SFR==0) //把数据设置到设置频率寄存器0
{
frequence_LSB=frequence_LSB|0x4000;
frequence_MSB=frequence_MSB|0x4000;
//使用频率寄存器0输出波形
AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
}
if(Freq_SFR==1) //把数据设置到设置频率寄存器1
{
frequence_LSB=frequence_LSB|0x8000;
frequence_MSB=frequence_MSB|0x8000;
//使用频率寄存器1输出波形
AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
AD9833_Write(frequence_MSB); //H14 频率寄存器1为
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
}
/*显示处理函数*/
if(WaveMode==TRI_WAVE) //输出三角波波形
{
AD9833_Write(0x2002);
//先写入显示缓冲区
//sprintf(string,"%s%.1fHz","",Freq);
}
if(WaveMode==SQU_WAVE) //输出方波波形
{
AD9833_Write(0x2028);
//先写入显示缓冲区
//sprintf(string,"%s%.1fHz","",Freq);
}
if(WaveMode==SIN_WAVE) //输出正弦波形
{
AD9833_Write(0x2000);
//先写入显示缓冲区
//sprintf(string,"%s%.1fHz","",Freq);
}
//LCD_DisplayStringLine(Line6,"V:2.73V");
}
复制代码
加载中...
查看其它27个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
代码如下
- /*
- *********************************************************************************************************
- * 函 数 名: AD9833_WaveSeting
- * 功能说明: 向SPI总线发送16个bit数据
- * 形 参: 1.Freq: 频率值, 0.1 hz - 12Mhz
- 2.Freq_SFR: 0 或 1
- 3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
- 4.Phase : 波形的初相位
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
- {
- int frequence_LSB,frequence_MSB,Phs_data;
- double frequence_mid,frequence_DATA;
- long int frequence_hex;
- /*********************************计算频率的16进制值***********************************/
- frequence_mid=268435456/25;//适合25M晶振
- //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
- frequence_DATA=Freq;
- frequence_DATA=frequence_DATA/1000000;
- frequence_DATA=frequence_DATA*frequence_mid;
- frequence_hex=frequence_DATA; //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
- frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
- frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
- frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
- frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
- Phs_data=Phase|0xC000; //相位值
- AD9833_Write(0x0100); //复位AD9833,即RESET位为1
- AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1
- if(Freq_SFR==0) //把数据设置到设置频率寄存器0
- {
- frequence_LSB=frequence_LSB|0x4000;
- frequence_MSB=frequence_MSB|0x4000;
- //使用频率寄存器0输出波形
- AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
- AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
- AD9833_Write(Phs_data); //设置相位
- //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
- }
- if(Freq_SFR==1) //把数据设置到设置频率寄存器1
- {
- frequence_LSB=frequence_LSB|0x8000;
- frequence_MSB=frequence_MSB|0x8000;
- //使用频率寄存器1输出波形
- AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
- AD9833_Write(frequence_MSB); //H14 频率寄存器1为
- AD9833_Write(Phs_data); //设置相位
- //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
- }
-
- /*显示处理函数*/
- if(WaveMode==TRI_WAVE) //输出三角波波形
- {
- AD9833_Write(0x2002);
- //先写入显示缓冲区
- //sprintf(string,"%s%.1fHz","",Freq);
- }
- if(WaveMode==SQU_WAVE) //输出方波波形
- {
- AD9833_Write(0x2028);
- //先写入显示缓冲区
- //sprintf(string,"%s%.1fHz","",Freq);
- }
- if(WaveMode==SIN_WAVE) //输出正弦波形
- {
- AD9833_Write(0x2000);
- //先写入显示缓冲区
- //sprintf(string,"%s%.1fHz","",Freq);
- }
- //LCD_DisplayStringLine(Line6,"V:2.73V");
- }
复制代码一周热门 更多>