OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6779|回复: 7

求mcp3424模拟量采集芯片的驱动程序

[复制链接]

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2014-9-18 17:49:07 | 显示全部楼层 |阅读模式
5金钱
我自己写的如下,但是有问题。请大家做过的给指点指点。
[mw_shl_code=c,true]#ifndef __MCP3424_ADC_H #define __MCP3424_ADC_H #include "sys.h" //MCP3424 // fields in configuration register // RDY C1 C0 nO/C S1 S0 G1 G0 #define MCP342X_GAIN_X1 0X00 // PGA gain X1 #define MCP342X_GAIN_X2 0X01 // PGA gain X2 #define MCP342X_GAIN_X4 0X02 // PGA gain X4 #define MCP342X_GAIN_X8 0X03 // PGA gain X8 #define MCP342X_12_BIT 0X00 // 12-bit 240 SPS 5ms #define MCP342X_14_BIT 0X04 // 14-bit 60 SPS 17ms #define MCP342X_16_BIT 0X08 // 16-bit 15 SPS 67ms //#define MCP342X_18_BIT 0X0C // 18-bit 3.75 SPS 267ms #define MCP342X_CONTINUOUS 0X10 // 1 = continuous, 0 = one-shot #define MCP342X_CHANNEL_1 0X00 // select MUX channel 1 #define MCP342X_CHANNEL_2 0X20 // select MUX channel 2 #define MCP342X_CHANNEL_3 0X40 // select MUX channel 3 #define MCP342X_CHANNEL_4 0X60 // select MUX channel 4 #define MCP342X_START 0X80 // write: start a conversion #define MCP342X_BUSY 0X80 // read: output not ready #define MCP342X_CHAL_1_CONFIG MCP342X_CHANNEL_1|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS #define MCP342X_CHAL_2_CONFIG MCP342X_CHANNEL_2|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS #define MCP342X_CHAL_3_CONFIG MCP342X_CHANNEL_3|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS #define MCP342X_CHAL_4_CONFIG MCP342X_CHANNEL_4|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS //IO方向设置 //#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;} //1000 F F F //#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;} //0011 F F F #define IIC_MCP3424_SDA_IN() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=8<<24;} //1000 F F F #define IIC_MCP3424_SDA_OUT() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=3<<24;} //0011 F F F //#define IIC_MCP3424_AD0_P() {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=3<<0;} //0011 F F F //#define IIC_MCP3424_AD0_F() {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=4<<0;} //0100 F F F //#define IIC_MCP3424_AD1_P() {GPIOC->CRH&=0XFFFFFF0F;GPIOC->CRH|=3<<4;} //0011 F F F //#define IIC_MCP3424_AD1_F() {GPIOC->CRH&=0XFFFFFF0F;GPIOC->CRH|=4<<4;} //0100 F F F //IO操作函数 #define IIC_MCP3424_SCL PCout(7) //SCL #define IIC_MCP3424_SDA PCout(6) //SDA #define IIC_MCP3424_READ_SDA PCin(6) //输入SDA #define IIC_MCP3424_AD0 PCout(8) //0 1 #define IIC_MCP3424_AD1 PCout(9) //0 1 //IIC所有操作函数 void IIC_MCP3424_Init(void); //初始化IIC的IO口 void IIC_MCP3424_Start(void); //发送IIC开始信号 void IIC_MCP3424_Stop(void); //发送IIC停止信号 void IIC_MCP3424_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_MCP3424_Read_Byte(unsigned char ack); u8 IIC_MCP3424_Wait_Ack(void); //IIC等待ACK信号 void IIC_MCP3424_Ack(void); //IIC发送ACK信号 void IIC_MCP3424_NAck(void); //IIC不发送ACK信号 void IIC_MCP3424_CHANGE_CHL(u8 channel); u16 IIC_MCP3424_READ(u8 channel); #endif[/mw_shl_code]

[mw_shl_code=c,true]void IIC_MCP3424_CHANGE_CHL(u8 channel)//14bit { switch (channel) { case 1: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd0);//write 1101 0000 IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Send_Byte(MCP342X_CHAL_1_CONFIG);//0x19); IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Stop(); break; case 2: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd0); IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Send_Byte(MCP342X_CHAL_2_CONFIG);//0x38) IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Stop(); break; case 3: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd0); IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Send_Byte(MCP342X_CHAL_3_CONFIG);//0x58); IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Stop(); break; case 4: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd0); IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Send_Byte(MCP342X_CHAL_4_CONFIG);//0x78); IIC_MCP3424_Wait_Ack(); IIC_MCP3424_Stop(); break; default: break; } } u16 IIC_MCP3424_READ(u8 channel)// { u16 ADC_H=0; u16 ADC_L=0; u8 ADC_config=0; u8 i=0; //u8 ADC_flag=0; static u16 rtn_1; static u16 rtn_2; static u16 rtn_3; static u16 rtn_4; switch (channel) { case 1: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_config=IIC_MCP3424_Read_Byte(1);//ack IIC_MCP3424_Wait_Ack(); do{ ADC_config=IIC_MCP3424_Read_Byte(1);//ack IIC_MCP3424_Wait_Ack(); //ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1; if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1 ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); rtn_1=ADC_H*256+ADC_L; return rtn_1; } i++; } while(i<20); return rtn_1; //break; case 2: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); //ADC_config=IIC_MCP3424_Read_Byte(1);//ack //IIC_MCP3424_Wait_Ack(); do{ ADC_config=IIC_MCP3424_Read_Byte(1);//ack IIC_MCP3424_Wait_Ack(); //ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1; if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1 ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); rtn_2=ADC_H*256+ADC_L; return rtn_2; } i++; } while(i<10); return rtn_2; //break; case 3: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); //ADC_config=IIC_MCP3424_Read_Byte(1);//ack //IIC_MCP3424_Wait_Ack(); do{ ADC_config=IIC_MCP3424_Read_Byte(1);//ack IIC_MCP3424_Wait_Ack(); //ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1; if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1 ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); rtn_3=ADC_H*256+ADC_L; return rtn_3; } i++; } while(i<10); return rtn_3; //break; case 4: IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); //ADC_config=IIC_MCP3424_Read_Byte(1);//ack //IIC_MCP3424_Wait_Ack(); do{ ADC_config=IIC_MCP3424_Read_Byte(1);//ack IIC_MCP3424_Wait_Ack(); //ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1; if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1 ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); IIC_MCP3424_Start(); IIC_MCP3424_Send_Byte(0xd1); IIC_MCP3424_Wait_Ack(); ADC_H=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_L=IIC_MCP3424_Read_Byte(1);// ack IIC_MCP3424_Wait_Ack(); ADC_config=IIC_MCP3424_Read_Byte(0);//Nack IIC_MCP3424_Stop(); rtn_4=ADC_H*256+ADC_L; return rtn_4; } i++; } while(i<10); return rtn_4; //break; default: break; } return 0; }[/mw_shl_code]
这下面的是main里的主要代码:
[mw_shl_code=c,true]int main() { while(1) { /*timer*/ if(delay_time2 == 0){ delay_time2 = 1;//10ms*1=10ms if(delay_ADC_10ms != 0)delay_ADC_10ms--; } switch (ADC_step) { case 1: if(delay_ADC_10ms==0){ delay_ADC_10ms=CHANGE_TIME; IIC_MCP3424_CHANGE_CHL(1); ADC_step++; } break; case 2: if(delay_ADC_10ms==0){ ADC_step++; } break; case 3: ADC_ch_1_tmp =IIC_MCP3424_READ(1); if(ADC_ch_1_tmp<32767) { ADC_ch_1=ADC_ch_1_tmp; } //else ADC_ch_1=0; printf("AD=%05u\r\n",ADC_ch_1); delay_ADC_10ms=3; ADC_step=1; break; case 20: ADC_step=1; break; default: break; } }//end while(1) }//end main()[/mw_shl_code]



最佳答案

查看完整内容[请看2#楼]

在手册上看到这个,无语了我。
原子哥是不是又要出黑科技了呀。^_^...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2014-9-18 17:49:08 | 显示全部楼层
在手册上看到这个,无语了我。

原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2014-9-18 17:58:14 | 显示全部楼层
我的问题是读到的数据ADC_ch_1中的D8有问题
ADC_ch_1用二进制表示为D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
检测高电压时D8位正常,检测低电压时D8位是512才进一,应该是255就要进一的呀。结果AD检测出来是锯齿行的波形。很郁闷啊。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2014-9-18 18:04:33 | 显示全部楼层
上网找到了个国外的历程。还是老外强啊。
https://github.com/battosai30/MCP3424
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2014-9-18 18:34:07 | 显示全部楼层
SOME ONE HELP ME LZ
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-18 23:03:56 | 显示全部楼层
帮顶....
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2014-9-19 11:38:25 | 显示全部楼层
悲催了。我发现这个芯片硬件设计有错误。本来256后D8才进一的,现在是512后才进一。跟踪出来的波形是锯齿行的。不是平滑的啊。mcp公司害死我了。看这个芯片的官方资料发现这个芯片的好多参数mcp都标明“未经测试”,“未经测试”啊,未经测试他们也敢卖?!!!。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2014-9-23 16:49:52 | 显示全部楼层
除了原子哥,没有人理我。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-1 01:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表