这是我写的dsPIC30F6015控制AD7715程序,亲测可用
单片机源程序如下:
#include _FOSC(CSW_FSCM_OFF & XT_PLL4); _FWDT(WDT_OFF); #define uchar unsigned char #define uint unsigned int #define CS_A LATCbits.LATC13 //RC13输出 #define DRDY PORTDbits.RD10 //RD10输入 uint result; void delay_ms(uint x) //延时程序 10M晶振 0.1us { uint a,b; for(a=x;a>0;a--) for(b=2500;b>0;b--); } void Init_PORT(void) { // TRISFbits.TRISF4 =0; //报警信号输出 //U2MODEbits.UARTEN=0; //禁止串口 TRISGbits.TRISG6=0; // SCK TRISGbits.TRISG7=1; // SDI TRISGbits.TRISG8=0; // SDO TRISDbits.TRISD10=1;// DRDY TRISCbits.TRISC13=0;// CS_A } //-------------------------------------------------------------------------------------------------- // 函数名称: Init_SPI2() // 函数功能: 初始化设置SPI2 // 入口参数: 无 // 返回值:无 //-------------------------------------------------------------------------------------------------- void Init_SPI2() { SPI2BUF=0; //数据寄存器清0 IFS1bits.SPI2IF=0;//清中断标志 IEC1bits.SPI2IE=0;//关闭中断 IPC6bits.SPI2IP=2;//中断优先级为2 SPI2STATbits.SPIEN=0; //禁止SPI2 SPI2CONbits.PPRE = 1;//主分频比16:1 SPI2CONbits.SPRE = 4;//预分频比4:1 SCk=10M/(16*4) SPI2CONbits.FRMEN = 0; //禁止帧SPI支持 SPI2CONbits.DISSDO = 0; //使用SDO2引脚 SPI2CONbits.MODE16 = 0; //8位通讯 SPI2CONbits.SMP = 0; //中间采样输入数据 SPI2CONbits.CKE = 0; //由空闲转为工作状态时输出数据 SPI2CONbits.CKP = 1; //空闲状态为高电平 SPI2CONbits.MSTEN = 1; //主模式 SPI2CONbits.SSEN = 0; //不使用SS2引脚 SPI2STATbits.SPISIDL = 0; //空闲模式下继续工作 SPI2STATbits.SPIROV = 0; //未溢出 SPI2STATbits.SPIEN = 1; //使能SPI2 } void Init_Uart2() { U2BRG=10;// set baudrate 56000BPS U2MODE =0x8000 ;//8位数据、无校验、一个停止位 IEC1bits.U2RXIE = 1; IPC6bits.U2RXIP = 5;// UART1接收器中断优先级位 IFS1bits.U2RXIF=0; IEC1bits.U2TXIE = 0; IPC6bits.U2TXIP = 6; U2STAbits.UTXISEL = 0; U2STAbits.UTXBRK = 0; U2STAbits.UTXBF = 0; U2STAbits.URXISEL = 0; U2STAbits.ADDEN = 0; U2STAbits.UTXEN = 1; } /************************************************************ * 函数名称:UART2_Send() * 串口2发送子函数 ************************************************************/ void UART2_Send(unsigned char data) { U2TXREG=data; while(IFS1bits.U2TXIF==0); IFS1bits.U2TXIF=0; } //-------------------------------------------------------------------------------------------------- // 函数名称: AD_write() // 入口参数: commuCFG通讯寄存器控制字 // 出口参数: 无 // 函数功能: 写AD7715 //-------------------------------------------------------------------------------------------------- void AD_write(unsigned char data) { unsigned char temp; CS_A=0; Nop(); SPI2BUF=data; while(IFS1bits.SPI2IF==0); IFS1bits.SPI2IF=0; temp=SPI2BUF; CS_A=1; Nop(); } uint read_from_ad7715()//读AD7715 二个字节 { uchar read_h,read_l; uint AD; while(DRDY); CS_A=0; Nop(); SPI2BUF=0xff; while(IFS1bits.SPI2IF==0); IFS1bits.SPI2IF=0; read_h=SPI2BUF; Nop(); SPI2BUF=0xff; while(IFS1bits.SPI2IF==0); IFS1bits.SPI2IF=0; read_l=SPI2BUF; AD=(read_h<<8)+read_l ; CS_A=1; return (AD); } int main(void) { Power_Management(); Init_PORT(); Init_SPI2(); Init_Uart2(); AD_write(0x10); //设定寄存器,写模式 增益为1 AD_write(0x6C); //设置SetReg,单端,60hz 自校验方式 时钟2.4576MHz 输入不加缓冲 while(1) { while(DRDY); //等待AD7715提供可读的数据 AD_write(0x38); Nop(); result=read_from_ad7715(); UART2_Send(result>>8); ……………………
上一篇:PWM控制MOSFET搭建的H桥电路驱动直流电机仿真与单片机源码
下一篇:直流有刷伺服控制系统(pic单片机,pid控制)