打印
[STM32F4]

STM32F405RGT6驱动AD9850

[复制链接]
3322|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LizzyC1991|  楼主 | 2015-7-11 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用STM32F405RGT6驱动AD9850,程序是从51单片机的程序改过来的,但是AD9850怎么都没有波形!!!!哪位大神可以指点一二啊!!!跪求!!!
void AD9850_Gpio_Init(void)
{
     GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
     GPIO_Init(GPIOC, &GPIO_InitStructure);

     GPIO_SetBits(GPIOC,GPIO_Pin_15 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
};

(头文件中有定义:
#define ad9850_w_clk PCout(6)
#define ad9850_fq_up PCout(7)
#define ad9850_rest  PCout(5)
#define ad9850_bit_data  PCout(15))

void ad9850_reset_serial(void)
{
     ad9850_w_clk = 0;
     ad9850_fq_up = 0;

     ad9850_rest = 0;
     ad9850_rest = 1;
     ad9850_rest = 0;

     ad9850_w_clk = 0;
     ad9850_w_clk = 1;
     ad9850_w_clk = 0;

     ad9850_fq_up = 0;
     ad9850_fq_up = 1;
     ad9850_fq_up = 0;
};

void ad9850_wr_serial(unsigned char w0,double frequence)
{
  
     unsigned char w;
  int i;  
     long int y;
     double x;
     x = 4294967295U/125;
     frequence = frequence/1000000;
     frequence = frequence * x;
     y=frequence;  
     w = (y>>=0);
     for(i=0;i<8;i++)
     {
         ad9850_bit_data = (w>>i)&0x01;
         ad9850_w_clk = 1;
         ad9850_w_clk = 0;
      }
// LED2 = 1;
     w = (y>>8);
     for(i=0;i<8;i++)
     {
         ad9850_bit_data = (w>>i)&0x01;
         ad9850_w_clk = 1;
         ad9850_w_clk = 0;
      }
// LED2 = 0;
     w = (y>>16);
     for(i=0;i<8;i++)
     {
         ad9850_bit_data = (w>>i)&0x01;
         ad9850_w_clk = 1;
         ad9850_w_clk = 0;
      }
// LED2 = 1;
     w = (y>>24);
     for(i=0;i<8;i++)
     {
         ad9850_bit_data = (w>>i)&0x01;
         ad9850_w_clk = 1;
         ad9850_w_clk = 0;
      }
// LED2 = 0;
     w = w0;
     for(i=0;i<8;i++)
     {
         ad9850_bit_data = (w>>i)&0x01;
         ad9850_w_clk = 1;
         ad9850_w_clk = 0;
      }
ad9850_fq_up = 1;
ad9850_fq_up = 0;
//LED2 = 1;
};


沙发
mmuuss586| | 2015-7-11 19:06 | 只看该作者
用示波器测下时序是否正确;

使用特权

评论回复
板凳
LizzyC1991|  楼主 | 2015-7-11 20:12 | 只看该作者
我用示波器测过ad9850_rest、和ad9850_fq_up、ad9850_bit_data的时序,是正确的,ad9850_w_clk不是太清楚,但是单步调试的时候,寄存器还有变量的值也是正确变化的。我想是不是系统频率的问题,时序要求里面对时间间隔是有一定要求的。

使用特权

评论回复
地板
Thor9| | 2015-7-11 21:48 | 只看该作者
时序问题是经常出错的,楼主按照数据 手册里的要求设置试试

使用特权

评论回复
5
LizzyC1991|  楼主 | 2015-7-12 10:54 | 只看该作者
Thor9 发表于 2015-7-11 21:48
时序问题是经常出错的,楼主按照数据 手册里的要求设置试试

时序我是按照以前51单片机的程序写的,驱动程序也不是很难,应该是没有问题的。以前使用51和msp430都是使用相同的时序,而且也都可以输出正常波形,但是这次使用STM32F405修改的程序,时序没有做任何改变,初始化问题我觉得也不存在,因为只用到了几个IO口而已,但是没法输出波形,我认为问题可能不是出在时序,而是使用不同的控制芯片,芯片之间的某些差异导致的。目前猜测很可能是STM32F405时钟频率过快,导致时序的时间宽度没法满足,可是我也尝试用延时的方法,没有成功。想请教下大牛们,能够帮我分析下是否是时钟频率的问题,我应该怎么修改,除了使用延时以外。

使用特权

评论回复
6
LizzyC1991|  楼主 | 2015-7-12 10:56 | 只看该作者
mmuuss586 发表于 2015-7-11 19:06
用示波器测下时序是否正确;

我用示波器测过ad9850_rest、和ad9850_fq_up、ad9850_bit_data的时序,是正确的,ad9850_w_clk不是太清楚,但是单步调试的时候,寄存器还有变量的值也是正确变化的。我想是不是系统频率的问题,时序要求里面对时间间隔是有一定要求的。

使用特权

评论回复
7
冰河w| | 2015-7-12 13:17 | 只看该作者
改程序的时候得注意了,IO口,时钟等得改对

使用特权

评论回复
8
hzpj01| | 2015-7-12 19:03 | 只看该作者
这种问题用示波器是很难查的,要用数字电路的万用表---逻辑分析仪来看.很直观的.

使用特权

评论回复
9
尤彼卡| | 2015-7-12 22:12 | 只看该作者
逻辑分析仪怎么用,我有一个可是还不会用,请教楼上

使用特权

评论回复
10
LizzyC1991|  楼主 | 2015-7-13 12:43 | 只看该作者
冰河w 发表于 2015-7-12 13:17
改程序的时候得注意了,IO口,时钟等得改对

我使用的是STM32F405的库函数进行的时钟设置:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
请问是不是这个时钟太快了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝