这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4t_25 [2020/09/25 15:24] fmj [三、实验原理] |
icore4t_25 [2022/04/01 10:46] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-09-25 | gingko | 初次建立 | | | V1.0 | 2020-09-25 | gingko | 初次建立 | | ||
行 82: | 行 81: | ||
==== 三、实验原理 ==== | ==== 三、实验原理 ==== | ||
- | **1、DAC简介** | + | === 1、DAC简介 === |
* STM32H750的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压Vref+(通ADC共用)以获得更精确的转换结果。 | * STM32H750的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压Vref+(通ADC共用)以获得更精确的转换结果。 | ||
* STM32H750的DAC模块主要特性: | * STM32H750的DAC模块主要特性: | ||
行 129: | 行 128: | ||
* 各 DAC 通道引脚的模拟输出电压通过以下公式确定: | * 各 DAC 通道引脚的模拟输出电压通过以下公式确定: | ||
- | **DAC_output= V_REF × DOR/4096** | + | * **DAC_output= V_REF × DOR/4096** |
=== 3、DAC部分寄存器介绍 === | === 3、DAC部分寄存器介绍 === | ||
行 135: | 行 134: | ||
* 我们介绍一下要实现 DAC 的通道 1 输出,需要用到的一些寄存器。首先是 DAC控制寄存器 DAC_CR,该寄存器的各位描述如图所示: | * 我们介绍一下要实现 DAC 的通道 1 输出,需要用到的一些寄存器。首先是 DAC控制寄存器 DAC_CR,该寄存器的各位描述如图所示: | ||
{{ :icore4t:icore4t_arm_hal_24_5.png?direct |}} | {{ :icore4t:icore4t_arm_hal_24_5.png?direct |}} | ||
+ | |||
* DAC_CR 的低 16 位用于控制通道 1,而高 16 位用于控制通道 2,我们这里仅列出比较本章需要设置的一些位: | * DAC_CR 的低 16 位用于控制通道 1,而高 16 位用于控制通道 2,我们这里仅列出比较本章需要设置的一些位: | ||
* EN1 位:用于 DAC 通道 1 的使能,我们需要用到 DAC 通道 1 的输出,该位必须设置为 1。 | * EN1 位:用于 DAC 通道 1 的使能,我们需要用到 DAC 通道 1 的输出,该位必须设置为 1。 | ||
行 143: | 行 143: | ||
* 然后,我们介绍 DAC 模式控制寄存器( DAC1_MCR),该寄存器各位描述如图所示: | * 然后,我们介绍 DAC 模式控制寄存器( DAC1_MCR),该寄存器各位描述如图所示: | ||
{{ :icore4t:icore4t_arm_hal_25_6.png?direct |}} | {{ :icore4t:icore4t_arm_hal_25_6.png?direct |}} | ||
+ | |||
* 位 2:0 MODE1[2:0]: DAC 通道 1 模式 (DAC Channel 1 mode) | * 位 2:0 MODE1[2:0]: DAC 通道 1 模式 (DAC Channel 1 mode) | ||
* 仅当 DAC 已禁止且不处于校准模式时( DACx_CR 寄存器中的位 EN1 = 0 且位 CEN1 = 0),才可写入这些位。如果 EN1=1 或 CEN1 =1,则会忽略写操作。这些位可由软件置 1 和清零,用于选择 DAC 通道 1 模式。 | * 仅当 DAC 已禁止且不处于校准模式时( DACx_CR 寄存器中的位 EN1 = 0 且位 CEN1 = 0),才可写入这些位。如果 EN1=1 或 CEN1 =1,则会忽略写操作。这些位可由软件置 1 和清零,用于选择 DAC 通道 1 模式。 | ||
行 158: | 行 159: | ||
=== 4、DDS原理 === | === 4、DDS原理 === | ||
- | |||
* 4.1 什么是频率 | * 4.1 什么是频率 | ||
* 频率是指单位时间内某事件重复的次数。在电子学中,信号的频率是指单位时间内信号的周期数,单位是赫兹(Hertz,简称Hz)。很多年前有一个著名的德国物理学家海因里希 · 鲁道夫 · 赫兹,他首先证明了电磁波的存在,为了纪念他,频率的单位就用他的名字命名。频率是一个非常常用、也是一个非常重要的国际单位;日常生活中,我们收听的收音机、观看的电视机、交流市电、移动蜂窝电话等信号的传输过程,都利用了信号的频率特性。频率与信号的周期互为倒数关系,所以频率也可以表示为: | * 频率是指单位时间内某事件重复的次数。在电子学中,信号的频率是指单位时间内信号的周期数,单位是赫兹(Hertz,简称Hz)。很多年前有一个著名的德国物理学家海因里希 · 鲁道夫 · 赫兹,他首先证明了电磁波的存在,为了纪念他,频率的单位就用他的名字命名。频率是一个非常常用、也是一个非常重要的国际单位;日常生活中,我们收听的收音机、观看的电视机、交流市电、移动蜂窝电话等信号的传输过程,都利用了信号的频率特性。频率与信号的周期互为倒数关系,所以频率也可以表示为: | ||
- | {{ :icore4t:icore4t_arm_hal_25_7.png?direct&650 |}} | + | {{ :icore4t:icore4t_arm_hal_25_7.jpg?direct&650 |}} |
* 4.2 怎么得到任意频率的信号 | * 4.2 怎么得到任意频率的信号 | ||
* 既然信号的频率特性那么重要,我们怎么样才能得到自己想要的频率的信号呢?一般来说,我们通过下面三种方法得到想要的频率信号。 | * 既然信号的频率特性那么重要,我们怎么样才能得到自己想要的频率的信号呢?一般来说,我们通过下面三种方法得到想要的频率信号。 | ||
行 170: | 行 170: | ||
* 直接数字合成(Direct Digital Synthesizer, DDS)是1971年由J.Tierncy等人提出的,它通过基于相位累加的变换方式,对输入频率进行变换,来达到任意频率输出的目的。它具有输出频率稳定、分辨率高、切换速度快等优点,配合波形查找表及相关路,它能产生任意的波形,这也是它最大的优势。 | * 直接数字合成(Direct Digital Synthesizer, DDS)是1971年由J.Tierncy等人提出的,它通过基于相位累加的变换方式,对输入频率进行变换,来达到任意频率输出的目的。它具有输出频率稳定、分辨率高、切换速度快等优点,配合波形查找表及相关路,它能产生任意的波形,这也是它最大的优势。 | ||
* 4.4 DDS原理 | * 4.4 DDS原理 | ||
- | * 一个典型的DDS系统包括相位累加器、幅度变换及DA转换电路。它基于同一个系统时钟驱动的。在某一个时钟时刻,相位累加器产生一个特定的相位角度,通过相位角度-幅度变换,查找到波形表中电压值,然后送给DAC,来重现这一时刻的模拟电压,这就完成了DDS工作的一个步进。通过不断的时钟驱动,我们就能得到连续的模拟波形。 | + | * 一个典型的DDS系统包括相位累加器、幅度变换及DA转换电路。它基于同一个系统时钟驱动的。在某一个时钟时刻,相位累加器产生一个特定的相位角度,通过相位角度-幅度变换,查找到波形表中电压值,然后送给DAC,来重现这一时刻的模拟电压,这就完成了DDS工作的一个步进。通过不断的时钟驱动,我们就能得到连续的模拟波形。 |
{{ :icore4t:icore4t_arm_hal_25_8.png?direct&700 |}} | {{ :icore4t:icore4t_arm_hal_25_8.png?direct&700 |}} | ||
* 4.4.1 相位累加器 | * 4.4.1 相位累加器 | ||
* 相位累加器(ACCUMULATOR)是DDS的核心,它由一个加法器和一个D触发器组成。相位累加器由多位组成,典型的应用中,一般取 16~48位。相位累加器工作过程中,时钟每动作一次,累加器便累加一次调谐字(TUNING WORD);所以相位累加器输出一个以时间为序列的数字字,它线性增长,直到达到最大值2n(假设该累加器为n位),如果大于最大值,则舍弃溢出的高位,仍然保留n位。 | * 相位累加器(ACCUMULATOR)是DDS的核心,它由一个加法器和一个D触发器组成。相位累加器由多位组成,典型的应用中,一般取 16~48位。相位累加器工作过程中,时钟每动作一次,累加器便累加一次调谐字(TUNING WORD);所以相位累加器输出一个以时间为序列的数字字,它线性增长,直到达到最大值2n(假设该累加器为n位),如果大于最大值,则舍弃溢出的高位,仍然保留n位。 | ||
* 为了形象的描述相位累加器的工作过程,我们可以把相位累加器看做一个圆周,如图三所示。其中,n表示相位累加器的位数,2n为相位累加器的模数,也就是圆周等分点数,每次的步进值为调谐字(TUNING WORD)。如果把相位累加器旋转一周作为一个周期的话,则最终频率输出可以用方程式(2)来描述。 | * 为了形象的描述相位累加器的工作过程,我们可以把相位累加器看做一个圆周,如图三所示。其中,n表示相位累加器的位数,2n为相位累加器的模数,也就是圆周等分点数,每次的步进值为调谐字(TUNING WORD)。如果把相位累加器旋转一周作为一个周期的话,则最终频率输出可以用方程式(2)来描述。 | ||
- | {{ :icore4t:icore4t_arm_hal_25_9.png?direct&700 |}} | + | {{ :icore4t:icore4t_arm_hal_25_9.jpg?direct&600 |}} |
* 如果把调谐字(TUNING WORD)设置为最小值1,带入方程式(2)则可得到最小输出频率,也就是频率分辨率。通过公式(3)我们可以看出,相位累加器位数越高,则频率分辨率越高。在100MHz的采样时钟下,48位的相位累加器可以使得频率分辨率优于 1μHz。 | * 如果把调谐字(TUNING WORD)设置为最小值1,带入方程式(2)则可得到最小输出频率,也就是频率分辨率。通过公式(3)我们可以看出,相位累加器位数越高,则频率分辨率越高。在100MHz的采样时钟下,48位的相位累加器可以使得频率分辨率优于 1μHz。 | ||
{{ :icore4t:icore4t_arm_hal_25_10.png?direct&700 |}} | {{ :icore4t:icore4t_arm_hal_25_10.png?direct&700 |}} | ||
行 186: | 行 185: | ||
{{ :icore4t:icore4t_arm_hal_25_12.png?direct&700 |}} | {{ :icore4t:icore4t_arm_hal_25_12.png?direct&700 |}} | ||
* 本实验中iCore4T的参考电压为2.5V,我们使用DAC1通道一作为DA输出,通过频率字控制输出频率为1KHz的正弦波。原理图如下: | * 本实验中iCore4T的参考电压为2.5V,我们使用DAC1通道一作为DA输出,通过频率字控制输出频率为1KHz的正弦波。原理图如下: | ||
- | {{ :icore4t:icore4t_arm_hal_25_13.png?direct&700 |}} | + | {{ :icore4t:icore4t_arm_hal_25_13.png?direct&500 |}} |
- | {{ :icore4t:icore4t_arm_hal_25_14.png?direct&700 |}} | + | {{ :icore4t:icore4t_arm_hal_25_14.png?direct&500 |}} |
==== 四、实验程序 ==== | ==== 四、实验程序 ==== | ||
=== 1、主函数 === | === 1、主函数 === | ||
行 196: | 行 195: | ||
SystemClock_Config(); | SystemClock_Config(); | ||
- | i2c.initialize(); | + | i2c.initialize(); |
- | axp152.initialize(); | + | axp152.initialize(); |
- | axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] | + | axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] |
- | axp152.set_dcdc2(1200);//[FPGA INT & PLL D] | + | axp152.set_dcdc2(1200);//[FPGA INT & PLL D] |
- | axp152.set_aldo1(2500);//[FPGA PLL A] | + | axp152.set_aldo1(2500);//[FPGA PLL A] |
- | axp152.set_dcdc4(3300);//[POWER_OUTPUT] | + | axp152.set_dcdc4(3300);//[POWER_OUTPUT] |
| | ||
- | axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] | + | axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] |
- | axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] | + | axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] |
- | axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] | + | axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] |
- | axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] | + | axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] |
MX_GPIO_Init(); | MX_GPIO_Init(); | ||
行 288: | 行 287: | ||
- 烧写程序到iCore4T上; | - 烧写程序到iCore4T上; | ||
- 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 | - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 | ||
- | ==== 实验现象 ==== | + | ==== 六、实验现象 ==== |
* 用示波器测量iCore4T底板的DAC引脚可以看到2Vpp 1KHz的正弦波,如下图。 | * 用示波器测量iCore4T底板的DAC引脚可以看到2Vpp 1KHz的正弦波,如下图。 | ||
- | {{ :icore4t:icore4t_arm_hal_25_15.png?direct&700 |}} | + | {{ :icore4t:icore4t_arm_hal_25_15.jpg?direct&600 |}} |