TI DSP 28335 ADC连续采样检测SPI控制的DAC输出 SCI串口232通信
文章目录
- 前言
- 1 SCIA FIFO 串口通信配置
- 2 DAC 数模转换 配置
- 2.1 TLV5620芯片简介
- 2.2 TLV5620初始化函数
- 2.2 DAC 输出函数
- 3 ADC 模数转换 配置
- 4 MAIN
- 5 实验分析
- 总结
前言
使用ADCINA0检测DAC的DB通道输出的电压值,并将DAC的DB输出电压值与ADCINA0检测的电压值通过串口输出。
SPI将DSP的指令发送给DAC实现DA转换
SCI将DSP存储的DAC转换结果和ADC采样结果发送给上位机
特此记录,加深印象~
1 SCIA FIFO 串口通信配置
博客TI DSP 28335 SCI FIFO中断 串口232通信已仔细介绍过SCIA配置。
此处不再详细展开介绍。
void UARTa_Init(Uint32 baud)
{unsigned char scihbaud=0;unsigned char scilbaud=0;Uint16 scibaud=0;scibaud=37500000/(8*baud)-1;scihbaud=scibaud>>8;scilbaud=scibaud&0xff;EALLOW;SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-AEDIS;InitSciaGpio();//Initalize the SCI FIFOSciaRegs.SCIFFTX.all=0xE040;SciaRegs.SCIFFRX.all=0x204f;SciaRegs.SCIFFCT.all=0x0;// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() functionSciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback// No parity,8 char bits,// async mode, idle-line protocolSciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKESciaRegs.SCICTL2.all =0x0003; SciaRegs.SCIHBAUD =scihbaud; // 9600 baud @LSPCLK = 37.5MHz.SciaRegs.SCILBAUD =scilbaud;
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop backSciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset}// Transmit a character from the SCI'
void UARTa_SendByte(int a)
{while (SciaRegs.SCIFFTX.bit.TXFFST != 0);SciaRegs.SCITXBUF=a;
}void UARTa_SendString(char * msg)
{int i=0;while(msg[i] != '\0'){UARTa_SendByte(msg[i]);i++;}
}
2 DAC 数模转换 配置
2.1 TLV5620芯片简介
TLV5620是一个四通道8位数模转换(DAC)器件,3V-3.6V单电源供电,3线串行总线。
它具有11位命令字,包括八位数据、两个DAC选择位和一个范围位,后者允许进行选择1或2倍的输出范围。
通道选择位 | 输出范围位 | 数据位 |
---|---|---|
A1A0 | RNG | D7D6D5D4D3D2D1D0 |
DAC寄存器是双缓冲的,允许一组完整的新值写入到设备, 然后所有的DAC输出通过控制LDAC同时更新。
本开发板TLV5620芯片进行DAC转换时,数据的加载才用的方式为,将LDAC脚接地,通过LOAD脚控制转换及更新。
当进行DAC转换时,在CLK的每个下降沿数据被锁存到数据终端。当所有数据位送入之后,LOAD为低脉冲将数据从串行输入寄存器转移到选定的DAC输出通道。
2.2 TLV5620初始化函数
void TLV5620_Init(void)
{EALLOW;// 开启SPIA时钟SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-AEDIS;// 初始化SpiaGPIOInitSpiaGpio();// DAC LOAD脚GPIO配置EALLOW;GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0; // GPIOGpioCtrlRegs.GPADIR.bit.GPIO26 = 1; // 输出GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // 上拉EDIS;// Spia配置SpiaRegs.SPICCR.all =0x0a; // 进入初始状态,数据在上升沿输出,自测禁止,11位数据模式SpiaRegs.SPICTL.all =0x0006; // 禁止溢出中断,普通SPI时钟,主机模式,使能发送,禁止SPI中断SpiaRegs.SPIBRR =0x0031; //SPI波特率=37.5M/50=0.75MHZSpiaRegs.SPICCR.all =0x8a; //退出初始状态,配置生效SpiaRegs.SPIPRI.bit.FREE = 1; // 自由运行,忽视仿真中断// DAC LOAD脚拉高GpioDataRegs.GPASET.bit.GPIO26 = 1;
}
2.2 DAC 输出函数
channel是4个通道的地址(00,01,10,11),rng是输出范围,dat是0~256数据
void DAC_SetChannelData(unsigned char channel,unsigned char rng,unsigned char dat)
{Uint16 dacvalue=0;//注意这里的有效数据是11位,SPI初始化中也进行了定义dacvalue = ((channel<<14) | (rng<<13) | (dat<<5));while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG ==1); //判断SPI的发送缓冲区是否为空SpiaRegs.SPITXBUF = dacvalue; //把发送的数据写入SPI发送缓冲区while( SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1); // DAC LOAD脚拉低 传递数据给DACGpioDataRegs.GPACLEAR.bit.GPIO26=1;DELAY_US(2);// DAC LOAD脚拉高GpioDataRegs.GPASET.bit.GPIO26 = 1;DELAY_US(10);}
3 ADC 模数转换 配置
博客TI DSP 28335 ADC ePWMSOC启动和Timer0启动已仔细介绍过ADC配置。
此处不再详细展开介绍。
该例程ADC采用软件触发。
注:不同于之前的ePWMSOC启动和Timer0启动,本例程采用连续采样模式(无需再次启动,但需要及时读取AD转换值)
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run
完整ADC配置如下:
void ADC_Init(void)
{EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADCEDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = 3; // HSPCLK = SYSCLKOUT/ADC_MODCLKEDIS;InitAdc(); // For this example, init the ADC// Specific ADC setup for this example:AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0f;AdcRegs.ADCTRL3.bit.ADCCLKPS = 1;AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded modeAdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run// Start SEQ1 软件触发AdcRegs.ADCTRL2.all = 0x2000;}Uint16 Read_ADCValue(void)
{while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4;
}
4 MAIN
//使用一根短接线,将DAC模块的DB输出口与P8排针的ADA0管脚连接。#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#include "uart.h"
#include "stdio.h"
#include "tlv5620.h"
#include "adc.h"void main()
{int i=0;Uint16 dacvalue=64;float dac_vol;Uint16 dac_temp=0;char dacbuf[6];float adc_vol;Uint16 adc_temp=0;InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();TIM0_Init(150,200000);//200msUARTa_Init(4800);TLV5620_Init();ADC_Init();while(1){i++;if(i%1000==0){DAC_SetChannelData(1,0,dacvalue*2);dac_vol=dacvalue*2*1.9/256;dac_temp=dac_vol*100;dacbuf[0]=dac_temp/100+0x30;dacbuf[1]='.';dacbuf[2]=dac_temp%100/10+0x30;dacbuf[3]=dac_temp%100%10+0x30;dacbuf[4]='V';dacbuf[5]='\0';UARTa_SendString("\r\nCH2_VOL=");UARTa_SendString(dacbuf);adc_vol=(float)Read_ADCValue()*3.0/4095;adc_temp=adc_vol*100;dacbuf[0]=adc_temp/100+0x30;dacbuf[1]='.';dacbuf[2]=adc_temp%100/10+0x30;dacbuf[3]=adc_temp%100%10+0x30;dacbuf[4]='V';dacbuf[5]='\0';UARTa_SendString("\r\nADC_CH1_VOL=");UARTa_SendString(dacbuf);}DELAY_US(1*1000);}
}
5 实验分析
dac_vol=dacvalue*2*1.9/256=64*2*1.9/256=0.95V
ADC采样电压为0.94V
总结
第42篇
21年第一更
要继续加油啊,战死为止
Flag完不成了,春节前肯定学不完DSP了
个人水平有限,有问题欢迎各位大神批评指正!
TI DSP 28335 ADC连续采样检测SPI控制的DAC输出 SCI串口232通信相关推荐
- STM8S系列基于IAR开发单通道ADC连续采样示例
STM8S系列基于IAR开发单通道ADC连续采样示例
- STM8单片机ADC连续采样模式
STM8S003单片机内部ADC为12位,A/D转换的各个通道可以执行单次和连续的转换模式. 单次转换模式的意思就是,ADC每次转换一次数据后,就会停止转换,如果还需要继续转换的话,就需要手动开启 ...
- TI DSP 28335 ePWM实现单路带死区PWM
文章目录 前言 1 PWM简介 2 死区简介 3 ePWM模块结构原理图 4 PWM 输出配置步骤:EPWM1_Init() 4.1 使能ePWM外设时钟,失能时间基准TB时钟 4.2 ePWM I/ ...
- TI DSP 28335 SCI FIFO中断 串口232通信
文章目录 前言 1 SCIA FIFO 串口通信配置步骤 1.1 使能SCIA外设时钟 1.2 初始化SCIA对应GPIO 1.3 SCI工作方式 1.3.1 数据格式 1.3.2 波特率 1.3.3 ...
- TI DSP 28335 看门狗(WatchDog)及通过看门狗实现中断
文章目录 前言 1 看门狗(监控芯片) 2 相关寄存器 2.1 WDCR看门狗控制寄存器 2.2 WDCNTR看门狗计数器寄存器 2.3 WDKEY看门狗复位寄存器 2.4 SCSR系统控制和状态寄存 ...
- STM8单片机ADC带缓存的连续采样模式
在上一篇文章中说了STM8的ADC连续采样模式,为了提高采样的精度和速率,STM8单片机还提供了带缓存的连续采样模式,也就是说ADC会连续采集8个数据,放在缓存中,读取数据时可以一次从缓存中读取8 ...
- stm32F4的ADC+DMA+Timer,实现2MHz连续采样。1LSB分辨率,极低噪声。
1. ADC+DMA+Timer的实现原理 stm32F407/405的ADC为12位逐次逼近型ADC,有着高达2.4MHz的采样率,分辨率 1LSB.这样参数的ADC放在市面上单卖,也起码是¥10+ ...
- STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储
文章目录 前言 一.STM32F4的ADC理论知识学习 1.基础知识 2.扫描模式与连续模式 3.单ADC模式下双缓存机制的实现 4.三重同步采样模式 二.由定时器触发的单缓冲区模式 1.时钟树配置 ...
- 如何使用S32K1的PDB模块触发多个ADC通道连续采样
文章目录 1. 外设模块介绍 1.1 PDB模块简介 1.2 ADC通道 1.3 ADC触发源 1.4 PDB触发多个ADC通道的两种方式 2. 例程 2.1 例程功能介绍 2.2 例程编写 2.2. ...
最新文章
- 越南一难倒博士的趣味数学题
- 计算机安全监控系统,关于计算机安全监控系统的关键技术
- 华为芯片设计面试题_未来想去华为海思做芯片设计,应该做哪些努力?
- Linux文本转语音合成教程,〔教程〕使用TTS将文本转语音输出
- 6.业务架构·应用架构·数据架构实战 --- 双轮驱动的技术架构设计
- html两个自然段怎么写,春天作文二个自然段
- delphi dll 使用
- Office 之将 PPT 图片完美插入 Word
- oracle 通过同义词创建视图
- 随机效应估算与固定效应估算_短面板数据学习手册(固定效应与随机效应等汇总)...
- Cecil学C#界面编程——配置环境和入门
- 【JavaScript】时间与时间戳相互转换
- mysql是大端小端_大端和小端 - HackerVirus - 博客园
- 如何使用 dlv 结合 Goland 进行程序 debug 调试
- 【SystemVerilog基础】关于随机化约束solve...before的深入探究
- CH3NH3PbI2Cl (MAPbI2Cl) 甲胺氯基钙钛矿 1446121-07-8
- Lumerical官方案例、FDTD时域有限差分法仿真学习(九)——布拉格光栅(Bragg gratings)
- 建站宝超级站群版 v1.4
- [DP46题] HDU 1864 最大报销额
- Go语言 一级函数 --- 匿名函数、高阶函数、闭包
热门文章
- Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)
- 从黑箱到企业: 管理,JMX 1.1 样式
- 用CSS实现段落前面缩进两个字
- 轻松判断放大电路的负反馈类型(电压反馈,电流反馈等有实例)
- 手写板行业调研报告 - 市场现状分析与发展前景预测
- 微信小程序_文档_08_组件_媒体组件_地图_画布_开放能力
- redis-shake 同步redis数据
- 基于BlueZ的C语言蓝牙编程
- 【Windows批处理】常用命令解析
- shineblink SYN6288语音输出