ADC
2016-07-11 16:36
330 查看
/*----------------------------------------------------- 功能:利用CPU定时器中断进行AD转换,并串口发送 -----------------------------------------------------*/ #include"DSP281x_Device.h" #include "DSP281x_Examples.h" #define ADC_MODCLK 0X3 #define ADC_CKPS 0X1 #define ADC_SHCLK 0Xf Uint16 ReceivedChar; interrupt void cpu_timer0_isr(); void Delay(); void Scib_init(); void Scib_xmit(Uint16 a); void Inadc_init(); void IN_ADCheck(); void main(void) { InitSysCtrl(); EALLOW; SysCtrlRegs.HISPCP.all=ADC_MODCLK; EDIS; DINT; //禁止和清除所有CPU中断向量表 InitPieCtrl(); //初始化PIE控制器 IER=0x0000; IFR=0x0000; InitPieVectTable(); //初始化中断向量表 EALLOW; PieVectTable.TINT0=&cpu_timer0_isr; //设置中断函数 EDIS; InitCpuTimers(); ConfigCpuTimer(&CpuTimer0,100,1000); StartCpuTimer0(); IER|=M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7=1; //开放cpuINT1.7,对应到连接外设ADC. EINT; ERTM; Inadc_init(); Scib_init(); EALLOW; GpioMuxRegs.GPGMUX.all|=0x0030; //使能SCIB口 EDIS; for(;;); } /*************定时中断函数*******************/ interrupt void cpu_timer0_isr() { IN_ADCheck(); PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; //允许继续响应中断 } void Delay() { Uint16 i; for(i=0;i<0xffff;i++) { asm("NOP"); } } /*************串口初始化函数******************/ void Scib_init() { ScibRegs.SCIFFTX.all=0xe040; //使能FIFO,允许发送,清除TXFFINT,禁止TX FIFO中断 ScibRegs.SCIFFRX.all=0x2021; //允许接收,清除RXFFINT,使能RX FIFO中断(1级) ScibRegs.SCIFFTX.all=0x0000; //禁止波特率检验 ScibRegs.SCICCR.all=0x0007; //1个停止位,8位数据位,无奇偶校验,空闲线模式 ScibRegs.SCICTL1.all=0x0003; ScibRegs.SCICTL2.all=0x0003; //SCI发送.接收使能和各中断使能 ScibRegs.SCIHBAUD=0x0001; ScibRegs.SCILBAUD=0x00e7; //波特率9600bps ScibRegs.SCICTL1.all=0x0023; //这句一直不明白什么意思 } /**********串口发送函数**************/ void Scib_xmit(Uint16 a) { ScibRegs.SCITXBUF=(a&0xff); while(ScibRegs.SCICTL2.bit.TXRDY!=1); //写a进SCI TXBUF,当TXRDY=0时,发送寄存器满 while(SciaRegs.SCICTL2.bit.TXEMPTY!=1); //当发送寄存器和移位寄存器都被装入数据,准备发送数据 } /**************AD初始化函数*******************/ void Inadc_init() { AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3; //带间隙和参考电路上电 Delay(); AdcRegs.ADCTRL3.bit.ADCPWDN=1; //其他电路(指模拟电路)上电 Delay(); AdcRegs.ADCTRL1.bit.ACQ_PS=ADC_SHCLK; //SOC脉宽为ADC_SHCLK+1; AdcRegs.ADCTRL3.bit.SMODE_SEL=1; //同步采样 AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //级联模式 AdcRegs.ADCTRL1.bit.CPS=1; AdcRegs.ADCTRL3.bit.ADCCLKPS=ADC_CKPS; //ADCCLKPS和CPS共同决定ADCCLK.具体见表格和流程图 AdcRegs.ADCMAXCONV.all=0x0007; AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0; //A0B0作为转换通道 AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1; AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x2; AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x3; AdcRegs.ADCCHSELSEQ2.bit.CONV04=0x4; AdcRegs.ADCCHSELSEQ2.bit.CONV05=0x5; AdcRegs.ADCCHSELSEQ2.bit.CONV06=0x6; AdcRegs.ADCCHSELSEQ2.bit.CONV07=0x7 c61c ; AdcRegs.ADCTRL1.bit.CONT_RUN=1; } /****************读取AD值,并且将数据发送至串口*******************/ void IN_ADCheck() { AdcRegs.ADCTRL2.all=0x2000; //软件触发 while(AdcRegs.ADCST.bit.INT_SEQ1==0); //等待进入中断,表示每个SEQ1排序转换结束。 //SEQ1使用的是MAX CONVn的后三位,本例为7,同步级联为8对 Delay(); AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除中断标志位 /*********以上为16路AD数据转换完成************/ ReceivedChar=(AdcRegs.ADCRESULT0>>4); //结果数据缓冲器存储的转换数据为左对齐,故需要右移4位 Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT1>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT2>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT3>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT4>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT5>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT6>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT7>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT8>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT9>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT10>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT11>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT12>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT13>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT14>>4); Scib_xmit(ReceivedChar&0xff); ReceivedChar=(AdcRegs.ADCRESULT15>>4); Scib_xmit(ReceivedChar&0xff); //猜想:以上用for语句 }
相关文章推荐
- 我的服务器SQL2000的sqlserver占用了90%的cpu,怎么查是那个库?
- MySQL服务器进程CPU占用100%的解决方法
- C#获取CPU编号的方法
- 使用MySQL Slow Log来解决MySQL CPU占用高的问题
- 笔记本下什么是迅驰处理器(cpu)相关资料第1/2页
- doscan.exe进程占用了大量的CPU和内存的解决方法
- CPU也有远程攻击漏洞 英特尔匆匆修补
- w3wp.exe占用cpu过高的解决方法第1/2页
- win2003中的w3wp.exe进程大量占用cpu资源的各种问题解决方法
- 服务器上w3wp.exe占用cpu过多有时候超过50%的原因分析
- 一个用了统计CPU 内存 硬盘 使用率的shell脚本
- shell脚本监控系统负载、CPU和内存使用情况
- Firefox浏览器狂占CPU解决办法
- Windows服务器上lsass.exe进程CPU使用率异常问题排查方法
- Python获取单个程序CPU使用情况趋势图
- JavaScript获取当前cpu使用率的方法
- 千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记
- C语言计算代码执行所耗CPU时钟周期
- linux查看cpu是否支持64位的方法
- python统计cpu利用率的方法