[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】PIC18F16Q40之DAC正弦波输出

[复制链接]
1948|0
 楼主| qjp1988113 发表于 2021-6-18 13:43 | 显示全部楼层 |阅读模式
本帖最后由 qjp1988113 于 2021-6-18 13:45 编辑

PIC18F16Q40带了8BIT的ADC,今天我们就来测试它。DAC的用途之一就是做成可调的直流电压。具体为DAC引脚输出,后面跟一级运放,就可以变成可调直流电压了,可以很好的节省成本。
今天我们不做直流电压,我们做一个正弦波发生器:
先配置,几乎没啥好配置的,配置好DAC,再使能一个引脚输出。

生成配置代码:

  1. void DAC1_Initialize(void)
  2. {
  3.     // OE DACOUT2 Enabled and DACOUT1 Disabled; DAC1EN enabled; NSS VSS; PSS VDD;
  4.     DAC1CON = 0xA0;
  5.     // DAC1R 154;
  6.     DAC1DATL = 0x9A;
  7. }

  8. void DAC1_SetOutput(uint8_t inputData)
  9. {
  10.     DAC1DATL  = inputData;
  11. }

  12. uint8_t DAC1_GetOutput(void)
  13. {
  14.     return DAC1DATL;
  15. }
不能再简单了。我们写一个电压转成DAC值的函数:
  1. //电压转ADC值
  2. #define Vref  3,3                    //ADC 参考电压
  3. #define resolution_dac  256          //DAC分辨率 BIT
  4. float VOLTG2DACValue(float Voltg)
  5. {
  6.     float tmp=0;
  7.     if (Voltg>5) return tmp;
  8.     //转换数据
  9.     tmp=resolution_dac*Voltg*1.0/Vref;
  10.     return tmp;
  11. }
我们写一个正弦波数据发生函数:
  1. uint8_t sin_tab[128];
  2. //直接输入DAC数据
  3. void getSinTab(uint8_t point,uint16_t maxnum)
  4. {
  5.     uint8_t i=0;
  6.     float   radian;     //弧度
  7.     float   angle;      //角度 分度角
  8.     angle=360.000/point;//步进角

  9.     for(i=0;i<point;i++)
  10.     {
  11.         radian=angle*i;//得到角度值
  12.         radian=radian*0.01744;//角度转弧度  弧度=角度*(π/180)
  13.         sin_tab[i]=(maxnum/2)*sin(radian)+(maxnum/2);
  14.     }
  15. }
  16. //输入电压
  17. void getSinTabFromVoltg(uint8_t point,float Voltg)
  18. {
  19.     uint8_t i=0;
  20.     uint16_t maxnum;                //DAC 值
  21.     float   radian;                 //弧度
  22.     float   angle;                  //角度 分度角
  23.    
  24.     maxnum=VOLTG2DACValue(Voltg);   //电压转成DAC值
  25.     angle=360.000/point;            //步进角

  26.     for(i=0;i<point;i++)
  27.     {
  28.         radian=angle*i;//得到角度值
  29.         radian=radian*0.01744;//角度转弧度  弧度=角度*(π/180)
  30.         sin_tab[i]=(maxnum/2)*sin(radian)+(maxnum/2);
  31.     }
  32. }
我们在main里面调用:
  1. #define POINT 100
  2. #define AM  1.0f
  3. ///////////////////////////////////
  4. getSinTabFromVoltg(POINT, AM);
  5.         while(1)
  6.         {
  7.             for(i=0;i<POINT ;i++)
  8.             {
  9.                 DAC1_SetOutput(sin_tab);
  10.                 __nop();
  11.                // __delay_us(1);
  12.             }
  13.         }


编译下载,查看示波器:


但是就是不加延时,100个点一个周期 最大页就是1.6K以上。做波形发生器还是不行的。
目前只能用PWM脉冲,然后RC滤波产生正弦波,理论上可以做到500K~
好了,DAC就到这了~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部