战舰v3开发板开发板实际用到的频率怎么测

第十三章 定时器中断实验
& && &&&这一章,我们将向大家介绍如何使用STM32的通用定时器,STM32的定时器功能十分强大,有TIME1和TIME8等高级定时器,也有TIME2~TIME5等通用定时器,还有TIME6和TIME7等基本定时器。在《STM32参考手册》里面,定时器的介绍占了1/5的篇幅,足见其重要性。在本章中,我们将使用TIM3的定时器中断来控制DS1的翻转,在主函数用DS0的翻转来提示程序正在运行。本章,我们选择难度适中的通用定时器来介绍,本章将分为如下几个部分:13.1 STM32通用定时器简介13.2 硬件设计13.3 软件设计13.4下载验证13.1 STM32通用定时器简介 & && && &STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。STM3的通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: 1)16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。2)16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间的任意数值。3)4个独立通道(TIMx_CH1~4),这些通道可以用来作为: A.输入捕获 B.输出比较 C.PWM生成(边缘或中间对齐模式) D.单脉冲模式输出 4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。5)如下事件发生时产生中断/DMA: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较 E.支持针对定位的增量(正交)编码器和霍尔传感器电路 F.触发输入作为外部时钟或者按周期的电流管理& && & 由于STM32通用定时器比较复杂,这里我们不再多介绍,请大家直接参考《STM32参考手册》第253页,通用定时器一章。下面我们介绍一下与我们这章的实验密切相关的几个通用定时器的寄存器。首先是控制寄存器1(TIMx_CR1),该寄存器的各位描述如图13.1.1所示:
图13.1.1 TIMx_CR1寄存器各位描述& & 在本实验中,我们只用到了TIMx_CR1的最低位,也就是计数器使能位,该位必须置1,才能让定时器开始计数。接下来介绍第二个与我们这章密切相关的寄存器:DMA/中断使能寄存器(TIMx_DIER)。该寄存器是一个16位的寄存器,其各位描述如图13.1.2所示:
图13.1.2 TIMx_ DIER寄存器各位描述
& && && &这里我们同样仅关心它的第0位,该位是更新中断允许位,本章用到的是定时器的更新中断,所以该位要设置为1,来允许由于更新事件所产生的中断。接下来我们看第三个与我们这章有关的寄存器:预分频寄存器(TIMx_PSC)。该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。该寄存器的各位描述如图13.1.3所示:
图13.1.3 TIMx_ PSC寄存器各位描述
& && & 这里,定时器的时钟来源有4个:1)内部时钟(CK_INT)2)外部时钟模式1:外部输入脚(TIx)3)外部时钟模式2:外部触发输入(ETR)4)内部触发输入(ITRx):使用A定时器作为B定时器的预分频器(A为B提供时钟)。& && &&&这些时钟,具体选择哪个可以通过TIMx_SMCR寄存器的相关位来设置。这里的CK_INT时钟是从APB1倍频的来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,当APB1的时钟不分频的时候,通用定时器TIMx的时钟就等于APB1的时钟。这里还要注意的就是高级定时器的时钟不是来自APB1,而是来自APB2的。& && &&&这里顺带介绍一下TIMx_CNT寄存器,该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值。& && &&&接着我们介绍自动重装载寄存器(TIMx_ARR),该寄存器在物理上实际对应着2个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《STM32参考手册》里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据TIMx_CR1寄存器中APRE位的设置:APRE=0时,预装载寄存器的内容可以随时传送到影子寄存器,此时2者是连通的;而APRE=1时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。自动重装载寄存器的各位描述如图13.1.4所示:
图13.1.4 TIMx_ ARR寄存器各位描述
& && && &最后,我们要介绍的寄存器是:状态寄存器(TIMx_SR)。该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。该寄存器的各位描述如图13.1.5所示:
&&图13.1.5 TIMx_ SR寄存器各位描述
& && &&&关于这些位的详细描述,请参考《STM32参考手册》第282页。 & && & 只要对以上几个寄存器进行简单的设置,我们就可以使用通用定时器了,并且可以产生中断。& && &&&这一章,我们将使用定时器产生中断,然后在中断服务函数里面翻转DS1上的电平,来指示定时器中断的产生。接下来我们以通用定时器TIM3为实例,来说明要经过哪些步骤,才能达到这个要求,并产生中断。1)TIM3时钟使能。这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为Stm32_Clock_Init函数里面把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2倍,等于系统时钟(72M)。2)设置TIM3_ARR和TIM3_PSC的值。通过这两个寄存器,我们来设置自动重装的值,以及分频系数。这两个参数加上时钟频率就决定了定时器的溢出时间。3)设置TIM3_DIER允许更新中断。因为我们要使用TIM3的更新中断,所以设置DIER的UIE位为1,使能更新中断。4)允许TIM3工作。光配置好定时器还不行,没有开启定时器,照样不能用。我们在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。5)TIM3中断分组设置。在定时器配置完了之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,以使能TIM3中断。6)编写中断服务函数。& && && &在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器SR的最低位。在处理完中断之后应该向TIM3_SR的最低位写0,来清除该中断标志。通过以上几个步骤,我们就可以达到我们的目的了,使用通用定时器的的更新中断,来控制DS1的亮灭。
13.2硬件设计 & && & 本实验用到的硬件资源有:1)&&指示灯DS0和DS12)&&定时器TIM3& && &&&本章将通过TIM3的中断来控制DS1的亮灭,DS1是直接连接到PE5上的,这个前面已经有介绍了。而TIM3属于STM32的内部资源,只需要软件设置即可正常工作。 13.3软件设计 & && & 软件设计我们在之前的工程上面增加,首先在HARDWARE文件夹下新建TIMER的文件夹。然后打开USER文件夹下的工程,新建一个timer.c的文件和timer.h的头文件,保存在TIMER文件夹下,并将TIMER文件夹加入头文件包含路径。我们在timer.c里输入如下代码:#include &timer.h&#include &led.h&//定时器3中断服务程序& &&&void TIM3_IRQHandler(void){& && && && && && && && && && && && && && && && && && && && & if(TIM3-&SR&0X0001)//溢出中断& && & {& && && && &&&LED1=!LED1;& && && && && && && && && && && && && && && && && && && && && && && && && && && && & & && & }& && && && && && && && && &&&& && & TIM3-&SR&=~(1&&0);//清除中断标志位& && & }//通用定时器3中断初始化//这里时钟选择为APB1的2倍,而APB1为36M//arr:自动重装值。//psc:时钟预分频数//这里使用的是定时器3!void TIM3_Int_Init(u16 arr,u16 psc){& && & RCC-&APB1ENR|=1&&1;& &&&//TIM3时钟使能& & & && &TIM3-&ARR=& && && && && &//设定计数器自动重装值//刚好1ms& & & && & TIM3-&PSC=& && && && && & //预分频器7200,得到10Khz的计数时钟& && && && && && & TIM3-&DIER|=1&&0;& && && &//允许更新中断& && & & && & TIM3-&CR1|=0x01;& && && &&&//使能定时器3& && &MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2& && && && && && && && && && && && && && && && && && && &&&}& &&&& && && &该文件下包含一个中断服务函数和一个定时器3中断初始化函数,中断服务函数比较简单,在每次中断后,判断TIM3的中断类型,如果中断类型正确,则执行LED1(DS1)的取反。TIM3_Int_Init函数就是执行我们上面介绍的那5个步骤,使得TIM3开始工作,并开启中断。该函数的2个参数用来设置TIM3的溢出时间。因为我们在Stm32_Clock_Init函数里面已经初始化APB1的时钟为2分频,所以APB1的时钟为36M,而从STM32的内部时钟树图(图5.2.2.1)得知:当APB1的时钟分频数为1的时候,TIM2~7的时钟为APB1的时钟,而如果APB1的时钟分频数不为1,那么TIM2~7的时钟频率将为APB1时钟的两倍。因此,TIM3的时钟为72M,再根据我们设计的arr和psc的值,就可以计算中断时间了。计算公式如下:Tout= ((arr+1)*(psc+1))/Tclk;其中:Tclk:TIM3的输入时钟频率(单位为Mhz)。Tout:TIM3溢出时间(单位为us)。& && &&&我们将timer.c文件保存,然后加入到HARDWARE组下。接下来,在timer.h文件里,我们输入如下代码:#ifndef __TIMER_H#define __TIMER_H#include &sys.h&&&void TIM3_Int_Init(u16 arr,u16 psc);#endif& && && &此部分代码十分简单,这里不做介绍。& && && &最后,我们在主程序里面输入如下代码: int main(void){& && && && && && && && && && && && && && && && && && && && & & && & Stm32_Clock_Init(9);& & //系统时钟设置& && & uart_init(72,9600);& && &//串口初始化为9600& && & delay_init(72);& && && && && && &//延时初始化 & && & LED_Init();& && && && && & //初始化与LED连接的硬件接口& && & BEEP_Init();& && && && && & //初始化蜂鸣器端口& && & KEY_Init();& && && &&&//初始化与按键连接的硬件接口& && & TIM3_Int_Init();& &//10Khz的计数频率,计数5K次为500ms&&& &&&while(1)& && & {& && && && &&&LED0=!LED0;& && && && &&&delay_ms(200);& && && && && && && & }& &&&}& && &&&这里的代码和之前大同小异,此段代码对TIM3进行初始化之后,进入死循环等待TIM3溢出中断,当TIM3_CNT的值等于TIM3_ARR的值的时候,就会产生TIM3的更新中断,然后在中断里面取反LED1,TIM3_CNT再从0 开始计数。13.4下载验证&& & && &在完成软件设计之后,我们将编译好的文件下载到战舰STM32开发板上,观看其运行结果是否与我们编写的一致。如果没有错误,我们将看DS0不停闪烁(每400ms闪烁一次),而DS1也是不停的闪烁,但是闪烁时间较DS0慢(1s一次)。
(668.27 KB, 下载次数: 21)
19:56 上传
点击文件名下载附件
(33.53 KB, 下载次数: 15)
19:56 上传
点击文件名下载附件
[ 本帖最后由 正点原子 于
19:56 编辑 ]
&&&&&&&&&&
EEWORLD 官方微信
Powered by
逛了这许久,何不进去瞧瞧?第二十四章 DAC实验 & && & 上两章,我们介绍了STM32的ADC使用,本章我们将向大家介绍STM32的DAC功能。在本章中,我们将利用按键(或USMART)控制STM32内部DAC模块的通道1来输出电压,通过ADC1的通道1采集DAC的输出电压,在LCD模块上面显示ADC获取到的电压值以及DAC的设定输出电压值等信息。本章将分为如下几个部分:24.1 STM32 DAC简介24.2 硬件设计24.3 软件设计24.4 下载验证
24.1 STM32 DAC简介 & && && &大容量的STM32F103具有内部DAC,战舰STM32选择的是STM32F103ZET6属于大容量产品,所以是带有DAC模块的。STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。STM32的DAC模块主要特点有:① 2个DAC转换器:每个转换器对应1个输出通道 ② 8位或者12位单调输出 ③ 12位模式下数据左对齐或者右对齐 ④ 同步更新功能 ⑤ 噪声波形生成 ⑥ 三角波形生成 ⑦ 双DAC通道同时或者分别转换⑧ 每个通道都有DMA功能 单个DAC通道的框图如图24.1.1所示:
图24.1.1 DAC通道模块框图 图中VDDA和VSSA为DAC模块模拟部分的供电,而Vref+则是DAC模块的参考电压。DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚)。从图24.1.1可以看出,DAC输出是受DORx寄存器直接控制的,但是我们不能直接往DORx寄存器写入数据,而是通过DHRx间接的传给DORx寄存器,实现对DAC输出的控制。前面我们提到,STM32的DAC支持8/12位模式,8位模式的时候是固定的右对齐的,而12位模式又可以设置左对齐/右对齐。单DAC通道x,总共有3种情况:①& &&&8位数据右对齐:用户将数据写入DAC_DHR8Rx[7:0]位(实际是存入DHRx[11:4]位)。②& &&&12位数据左对齐:用户将数据写入DAC_DHR12Lx[15:4]位(实际是存入DHRx[11:0]位)。③& &&&12位数据右对齐:用户将数据写入DAC_DHR12Rx[11:0]位(实际是存入DHRx[11:0]位)。我们本章使用的就是单DAC通道1,采用12位右对齐格式,所以采用第③种情况。如果没有选中硬件触发(寄存器DAC_CR1的TENx位置’0’),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。如果选中硬件触发(寄存器DAC_CR1的TENx位置’1’),数据传输在触发发生以后3个APB1时钟周期后完成。 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。我们可以从STM32F103ZET6的数据手册查到的典型值为3us,最大是4us。所以DAC的转换速度最快是250K左右。本章我们将不使用硬件触发(TEN=0),其转换的时间框图如图24.1.2所示:
图24.1.2 TEN=0时DAC模块转换时间框图当DAC的参考电压为Vref+的时候,DAC的输出电压是线性的从0~Vref+,12位模式下DAC输出电压与Vref+以及DORx的计算公式如下:DACx输出电压=Vref*(DORx/4095)接下来,我们介绍一下要实现DAC的通道1输出,需要用到的一些寄存器。首先是DAC控制寄存器DAC_CR,该寄存器的各位描述如图24.1.3所示:
图24.1.3 寄存器DAC_CR各位描述 & && & DAC_CR的低16位用于控制通道1,而高16位用于控制通道2,我们这里仅列出比较重要的最低8位的详细描述,如图24.1.4所示:
图24.1.4 寄存器DAC_CR低八位详细描述& && & 首先,我们来看DAC通道1使能位(EN1),该位用来控制DAC通道1使能的,本章我们就是用的DAC通道1,所以该位设置为1。& && & 再看关闭DAC通道1输出缓存控制位(BOFF1),这里STM32的DAC输出缓存做的有些不好,如果使能的话,虽然输出能力强一点,但是输出没法到0,这是个很严重的问题。所以本章我们不使用输出缓存。即设置该位为1。& && & DAC通道1触发使能位(TEN1),该位用来控制是否使用触发,里我们不使用触发,所以设置该位为0。& && & DAC通道1触发选择位(TSEL1[2:0]),这里我们没用到外部触发,所以设置这几个位为0就行了。& && & DAC通道1噪声/三角波生成使能位(WAVE1[1:0]),这里我们同样没用到波形发生器,故也设置为0即可。& && & DAC通道1屏蔽/复制选择器(MAMP[3:0]),这些位仅在使用了波形发生器的时候有用,本章没有用到波形发生器,故设置为0就可以了。& && & 最后是DAC通道1 DMA使能位(DMAEN1),本章我们没有用到DMA功能,故还是设置为0。& && & 通道2的情况和通道1一模一样,这里就不不细说了。在DAC_CR设置好之后,DAC就可以正常工作了,我们仅需要再设置DAC的数据保持寄存器的值,就可以在DAC输出通道得到你想要的电压了(对应IO口设置为模拟输入)。本章,我们用的是DAC通道1的12位右对齐数据保持寄存器:DAC_DHR12R1,该寄存器各位描述如图24.1.5所示:
图24.1.5 寄存器DAC_DHR12R1各位描述 & && & 该寄存器用来设置DAC输出,通过写入12位数据到该寄存器,就可以在DAC输出通道1(PA4)得到我们所要的结果。& && & 通过以上介绍,我们了解了STM32实现DAC输出的相关设置,本章我们将使用DAC模块的通道1来输出模拟电压,其详细设置步骤如下: 1)开启PA口时钟,设置PA4为模拟输入。STM32F103ZET6的DAC通道1是接在PA4上的,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输入(虽然是输入,但是STM32内部会连接在DAC模拟输出上)。2)使能DAC1时钟。同其他外设一样,要想使用,必须先开启相应的时钟。STM32的DAC模块时钟是由APB1提供的,所以我们先要在APB1ENR寄存器里面设置DAC模块的时钟使能。 3)设置DAC的工作模式。该部分设置全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。& &4)设置DAC的输出值。通过前面3个步骤的设置,DAC就可以开始工作了,我们使用12位右对齐数据格式,所以我们通过设置DHR12R1,就可以在DAC输出引脚(PA4)得到不同的电压值了。最后,再提醒一下大家,本例程,我们使用的是3.3V的参考电压,即Vref+连接VDDA。通过以上几个步骤的设置,我们就能正常的使用STM32的DAC通道1来输出不同的模拟电压了。24.2 硬件设计 本章用到的硬件资源有:1)&&指示灯DS02)&&WK_UP和KEY1按键3)&&串口4)&&TFTLCD模块5)&&ADC6)&&DAC 本章,我们使用DAC通道1输出模拟电压,然后通过ADC1的通道1对该输出电压进行读取,并显示在LCD模块上面,DAC的输出电压,我们通过按键(或USMART)进行设置。我们需要用到ADC采集DAC的输出电压,所以需要在硬件上把他们短接起来。ADC和DAC的连接原理图如图24.2.1所示:
图24.2.1 ADC、DAC与STM32连接原理图 & && & P14是多功能端口,我们只需要通过跳线帽短接P14的ADC和DAC,就可以开始做本章实验了。如图24.2.2所示:
图24.2.2 硬件连接示意图
24.3 软件设计 找到上一章的工程,首先在HARDWARE文件夹下新建一个DAC的文件夹。然后打开USER文件夹下的工程,新建一个dac.c的文件和dac.h的头文件,保存在DAC文件夹下,并将DAC文件夹加入头文件包含路径。打开dac.c,输入如下代码:#include &dac.h&//DAC通道1输出初始化 void Dac1_Init(void){& && & RCC-&APB2ENR|=1&&2;& & //使能PORTA时钟& && && &&&& && & RCC-&APB1ENR|=1&&29;& &//使能DAC时钟& && && && && & GPIOA-&CRL&=0XFFF0FFFF; & && & GPIOA-&CRL|=0X;//PA4 模拟输入& && && && & DAC-&CR|=1&&0;&&//使能DAC1& && & DAC-&CR|=1&&1;&&//DAC1输出缓存不使能 BOFF1=1& && & DAC-&CR|=0&&2;&&//不使用触发功能 TEN1=0& && & DAC-&CR|=0&&3;&&//DAC TIM6 TRGO,不过要TEN1=1才行& && & DAC-&CR|=0&&6;&&//不使用波形发生& && & DAC-&CR|=0&&8;&&//屏蔽、幅值设置& && & DAC-&CR|=0&&12;& && & //DAC1 DMA不使能& & & && & DAC-&DHR12R1=0;}//设置通道1输出电压//vol:0~3300,代表0~3.3Vvoid Dac1_Set_Vol(u16 vol){& && & float temp=& && & temp/=1000;& && & temp=temp*;& && & DAC-&DHR12R1=}此部分代码就2个函数,Dac1_Init函数用于初始化DAC通道1。这里基本上是按我们上面的步骤来初始化的,经过这个初始化之后,我们就可以正常使用DAC通道1了。第二个函数Dac1_Set_Vol,用于设置DAC通道1的输出电压,通过USMART调用该函数,就可以随意设置DAC通道1的输出电压了。 保存dac.c代码,并将该代码加入HARDWARE组下。接下来在dac.h文件里面输入如下代码:#ifndef __DAC_H#define __DAC_H&&#include &sys.h&& && && &void Dac1_Init(void);& && && &&&//DAC通道1初始化& && && & void Dac1_Set_Vol(u16 vol); //设置通道1输出电压#endif该部分代码很简单,这里我们就不多说了。接下来我们在test.c里面,修改main函数如下:int main(void){& &&&& && & u16& && && && &u8 t=0;& & & && & u16 dacval=0;& && & u8& && &Stm32_Clock_Init(9);& & //系统时钟设置& && & uart_init(72,9600);& && &//串口初始化为9600& && & delay_init(72);& && && && && && &//延时初始化 & && & LED_Init();& && && && && &&&//初始化与LED连接的硬件接口& && &LCD_Init();& && && && && && &//初始化LCD& && & usmart_dev.init(72);& && &//初始化USMART& && &&&& && & KEY_Init();& && && && && && &//按键初始化& && && && &&&& && &Adc_Init();& && && && && && & //ADC初始化& && & Dac1_Init();& && && && && & //DAC通道1初始化& && & & && & POINT_COLOR=RED;//设置字体为红色 & && & LCD_ShowString(60,50,200,16,16,&WarShip STM32&);& & & && & LCD_ShowString(60,70,200,16,16,&DAC TEST&);& &&&& && & LCD_ShowString(60,90,200,16,16,&ATOM@ALIENTEK&);& && & LCD_ShowString(60,110,200,16,16,&&);& && & & && & LCD_ShowString(60,130,200,16,16,&WKUP:+&&KEY1:-&);& &&&& && & //显示提示信息& && && && && && && && && && && && && && && && && && && && && && && && && && && && && & POINT_COLOR=BLUE;//设置字体为蓝色& && & LCD_ShowString(60,150,200,16,16,&DAC VAL:&);& && && & & && & LCD_ShowString(60,170,200,16,16,&DAC VOL:0.000V&);& && && && & & && & LCD_ShowString(60,190,200,16,16,&ADC VOL:0.000V&);& && && &&&& && & DAC-&DHR12R1=//初始值为0& && && && && && && && && && & while(1)& && & {& && && && &&&t++;& && && && &&&key=KEY_Scan(0);& && && && && && && &&&& && && && &&&if(key==4)& && && && &&&{& && && && && && && && && && && &if(dacval&4000)dacval+=200;& && && && && && && &DAC-&DHR12R1=& && && && &//输出& &&&& && && && &&&}else if(key==2)& &&&& && && && &&&{& && && && && && && &if(dacval&200)dacval-=200;& && && && && && && &else dacval=0;& && && && && && && &DAC-&DHR12R1=& && && &&&//输出& && && && &&&}& &&&& && && && &&&if(t==10||key==2||key==4)& && && &&&//WKUP/KEY1按下了,或者定时时间到了& && && && &&&{& && & & && && && && && &&&adcx=DAC-&DHR12R1;& && && && && && && &LCD_ShowxNum(124,150,adcx,4,16,0);& && && && && &&&//显示DAC寄存器值& && && && && && && &temp=(float)adcx*(3.3/4096);& && && && && && && && && && && &&&//得到DAC电压值& && && && && && && &adcx=& && && && && && &&&LCD_ShowxNum(124,170,temp,1,16,0);& && && && && &&&//显示电压值整数部分& && && && && && &&&temp-=& && && && && && && &temp*=1000;& && && && && && && &LCD_ShowxNum(140,170,temp,3,16,0X80);& &&&//显示电压值的小数部分& && && && && && &&&adcx=Get_Adc_Average(ADC_CH1,10);& && && && &//得到ADC转换值& && && && && && && && && && &temp=(float)adcx*(3.3/4096);& && && && && && && && && && && &&&//得到ADC电压值& && && && && && && &adcx=& && && && && && &&&LCD_ShowxNum(124,190,temp,1,16,0);& && &&&//显示电压值整数部分& && && && && && &&&temp-=& && && && && && && &temp*=1000;& && && && && && && &LCD_ShowxNum(140,190,temp,3,16,0X80);& &&&//显示电压值的小数部分& && && && && && && &LED0=!LED0;& && && & & && && && && && && &t=0;& && && && &&&}& && && && && && && &&&delay_ms(10);
& && & }}此部分代码,我们先对需要用到的模块进行初始化,然后显示一些提示信息,本章我们通过WK_UP和KEY1(也就是上下键)来实现对DAC输出的幅值控制。按下WK_UP增加,按KEY1减小。同时在LCD上面显示DHR12R1寄存器的值、DAC设计输出电压以及ADC采集到的DAC输出电压。本章,我们还可以利用USMART来设置DAC的输出电压值,故需要将Dac1_Set_Vol函数加入USMART控制,方法前面已经有详细的介绍了,大家这里自行添加,或者直接查看我们光盘的源码。 从main函数代码可以看出,按键设置输出电压的时候,每次都是以0.161V递增或递减的,而通过USMART调用Dac1_Set_Vol函数,则可以实现任意电平输出控制(当然得在DAC可控范围内)。24.4 下载验证 在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图24.4.1所示
图24.4.1 DAC实验测试图同时伴随DS0的不停闪烁,提示程序在运行。此时,我们通过按WK_UP按键,可以看到输出电压增大,按KEY1则变小。大家可以试试在USMART调用Dac1_Set_Vol函数,来设置DAC通道1的输出电压,如图24.4.2所示:
图24.4.2 通过usmart设置DAC通道1的电压输出
(851.13 KB, 下载次数: 36)
21:36 上传
点击文件名下载附件
(109.97 KB, 下载次数: 16)
21:36 上传
点击文件名下载附件
[ 本帖最后由 正点原子 于
21:36 编辑 ]
支持一下 HOHO&
&&&&&&&&&&
在线时间9276 小时
威望185487分
芯币17003枚
TA的帖子TA的资源
回复 楼主 正点原子 的帖子
支持一下 HOHO
2017,加油!继续为中国电子行业做出小小的贡献吧!
在线时间83 小时
芯币1132枚
TA的帖子TA的资源
一粒金砂(中级), 积分 68, 距离下一级还需 132 积分
一粒金砂(中级), 积分 68, 距离下一级还需 132 积分
EEWORLD 官方微信
Powered by
逛了这许久,何不进去瞧瞧?}

我要回帖

更多关于 战舰开发板原理图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信