137 DAC

本文介绍了一个使用定时器触发DAC转换产生正弦波的嵌入式系统设计实例。通过配置定时器中断和DAC模块,实现了每1ms产生一次正弦波形输出,实验结果与预期一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "bat32g137.h"
#include "EventRecorder.h"              // Keil.ARM Compiler::Compiler:Event Recorder
#include "dac.h"
#include "math.h"
#include "stdio.h"
#include "tim4.h"
#include "elc.h"

#define PI 3.1415f
static char buff[256];

#define DAC_REAL_TIME

// 分辨率为8位
int main(void)
{
	// 调试模式
	SystemCoreClockUpdate();
	EventRecorderInitialize(0,0);
	EventRecorderStart();
	
	#ifdef DAC_NORMAL
	
	
	// 初始化通道
	DAC_Init(DAC_CHANNEL_0); // P22
	// 启动通道
	DAC_Start(DAC_CHANNEL_0);
	// 计算测试值
	for(unsigned short i = 0;i < 180;i++){
			buff[i] = 256*sin(i*PI/180);
			printf("buff[%d] = %d\r\n",i,buff[i]);
	}
	while(1)
	{
		// 输出DAC波形
		for(unsigned short i = 0;i < 180;i++){
			DAC_Set_Value(DAC_CHANNEL_0,buff[i]);
		}
	}
	#endif
	#ifdef DAC_REAL_TIME
	TM4_IntervalTimer(TM4_CHANNEL_0,48000);
	INTC_EnableIRQ(TM00_IRQn);
	CGC->PER1 |= CGC_PER1_DACEN_Msk;     /* enables input clock supply */
    DAC->DAM  = 0x00U;
	// 配置为实时模式
	DAC->DAM |= _01_DA0_TIME_OUTPUT_MODE;
	DAC->DACS0 = _00_DA0_COUVERSION_VALUE;
	/* Set ANO0 pin */
	PORT->PMC2 |= 0x04U;
	PORT->PM2  |= 0x04U;
   
	// 启动通道
	DAC_Start(DAC_CHANNEL_0);
	
	// 计算测试值
	for(unsigned short i = 0;i < 180;i++){
			buff[i] = 256*sin(i*PI/180);
			printf("buff[%d] = %d\r\n",i,buff[i]);
	}
	// 使用timer4 通道0 链接到DAC 通道0 上。
	ELC_Start(_10_ELC_EVENT_INTTM00,_08_ELC_EVENT_LINK_DA0);
	
	while(1)
	{
		
	}
	#endif
}

void IRQ17_Handler(void) __attribute__((alias("tim4_channel0_interrupt")));

static void tim4_channel0_interrupt(void)
{
    INTC_ClearPendingIRQ(TM00_IRQn);    /* clear INTTM00 interrupt flag */
    /* Start user code. Do not edit comment generated here */
	static uint16_t count = 0;
	DAC_Set_Value(DAC_CHANNEL_0,buff[count]);
	if(count < 180){
		count++;
	}else{
		count = 0;
	}
    /* End user code. Do not edit comment generated here */
}



定时器触发DAC转换,1ms一次,产生正弦波,实际测试如图结果和预期吻合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值