还剩12页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
使用教程INA226此教程案例可以直接在正点原子运行stm32f429配置文件,ina226ina
226.c
1.#include ina
226.h
2.#include usart.h
3.#include delay.h
4./*
5.不确定具体电阻大小6・*/
7.INA226INA226_data;
8.
9.void INA226_Initvoid
10.{
11.IIC_Init;
12.delay_ms10;
13.1NA226_SendData工NA226_ADDR1,CFG_REG,0x484f;〃谊爵镯的间或屐俺啜
228.采样时间为204*128,设置模式为分流和总线连续模式
14.1NA226_SendData工NA226_ADDR1,CAL_REG,0x0012;〃波置分瘫压转电游旅统^
15.}
16.void INA226_SetRegPointeru8addr^u8reg
17.{
18.IIC_Start;
19.
20.IIC_Send_Byteaddr;
21.IIC_Wait_Ack;
22.
23.IIC_Send_Bytereg;
24.IIC_Wait_Ack;
25.
26.IIC_Stop;
27.
28.
29..〃发之写入
100.//返回从机有无应答有应答
101.//I,//0,无应答
102.
103.void IIC_Send_Byteu8txd
104.{
105.u8t;
106.SDA_OUT;
107.4cL=0/拉低时钟开始数据传输
108.fort=0;t8;t++
109.{
110.IIC_SDA=txd0x807;
111.txd=l;
112.delay_us2;//对TEA5767这三个延时都是必须的
113.IIC_SCL=1;
114.delay_us2;
115.IIC_SCL=0;
116.delay_us2;
117.}
118.}
119.//读,个字节,ack=l时,发送ACK/ock=0,发送nACK
120.u8IIC_Read_Byteunsigned charack
121.{
122.unsigned charreceive=0;
123.SDA_IN;//SD4设置为输入
124.fori=0;i8;i++
125.{
126.IIC_SCL=0;
127.delay_us2;
128.IIC_SCL=1;
129.receive=l;
130..ifREAD_SDAreceive++;
131.delay_usl;
132.}
133.if!ack
134.11C_N Ac k;//^2^nA CK
135.else
136.IIC_Ack;//发送4CK
137.return receive;
138.}
139.
140.iic.h
1.#ifndef_MY工工C_H
2.#define_MYIIC_H
3.#include sys.h
4.////////////////////////////////////////////////////////////////////////////////////本程序只供学习使用,未经作者许可,不得用于其它任何用途
5.
6.//ALIENTEK STM32F429开发板
7.//口驱动代码
8.//正点原子@21ENTEK
9.・//技术论坛:u/k/iv.openedv.com10・//创建日期:2016/1/13\\.//版本V
1.0\
2.//版权所有,盗版必究
13.//CopyrightC广州市星翼电子科技有限公司2014-20241^.//ALL rightsreserved
15.・//////////////////////////////////////////////////////////////////////////////////
16.//工方向设置
17.#define SDA_IN{GPIOH-MODER=-35*2;GPIOH-MODER|=05*2;}//PH5输入模式
18.#define SDA_OUT{GPIOH-MODER=-35*2;GPIOH-MODER|=15*2;}//PH5输出模式
19..//工操作
20.#define IIC_SCL PHout4//SCL
21.#define IIC_SDA PHout5//SDA
22.#define READ_SDA PHin5//输入SDA
23.
24.//工工2所有操作函数
25.void IIC_Initvoid;//初始化工工C的工口
26.void IIC_Startvoid;//发送工工C开始信号
27.void IIC_Stopvoid;//发送工1C停止信号
28.void IIC_Send_Byteu8txd;//工工C发送一个字节
29.u8IIC_Read_Byteunsigned charack;//2K读驭一^个字节
30.u8IIC_Wait_Ackvoid;//VLC等待ACK信号
31.void IIC_Ackvoid;//工工C发送ACK信号
32.void IIC_NAckvoid;//LLC不发送ACK信号
33.
34.void IIC_Write_One_Byteu8daddr,u8addr\u8data;
35.u8IIC__Read_One__Byteu8daddr,u8addr;
36.#endif
30.void INA226_SendDatau8addr,u8reg^ul6data
31.{
32.u8temp=0;
33.IIC_Start;
34.
35..IIC_Send_Byteaddr;
36.IIC_Wait_Ack;
37.
38.IIC_Send_Bytereg;
39.IIC_Wait_Ack;
40.
41.temp=u8data8;
42.IIC_Send_Bytetemp;
43.IIC_Wait_Ack;
44.
45.temp=u8data0x00FF;
46.IIC_Send_Bytetemp;
47.IIC_Wait_Ack;
48.
49.IIC_Stop;
50.}
51.
52.//读取
53.U16INA226_ReadDatau8addr
54.{
55.ul6temp=0;
56.IIC_Start;
57.
58.IIC_Send_Byteaddr+l;
59.IIC_Wait_Ack;
60.
61.temp=IIC_Read_Bytel;
62.temp=8;
63.temp|=IIC_Read_Byte0;
64.
65.IIC_Stop;
66.return temp;
67.
68./*
69.u8INA226_ALertAddr
70.{
71.u8temp;
72.IIC_Start;
73.
74.IIC_Send_ByteINA226_GETALADDR;
75.IIC_lAlait_Ack;
76.
77.temp=IIC_Read_Bytel;
78.;
79.IIC_Stop
80.return temp;
81.}
82.*/
83.
84.//lmA/bit
85.ul6INA226_GetShunt_Currentu8addr
86.{
87.ul6temp=0;
88.INA226_SetRegPointeraddr,CUR_REG;
89.temp=INA226_ReadDataaddr;
90.iftemp0x8000temp=〜temp-1;
91.return temp;
92.
93.
94.//获取id
95.U16INA226_Get_IDu8addr
96.{
97.u32temp=0;
98.INA226_SetRegPointeraddr,INA226_GET_ADDR;
99.temp=INA226_ReadDataaddr;
100.return ul6temp;
101.}
102.//获取校准值
103.
104.U16INA226_GET_CAL_REGu8addr
105.{
106.u32temp=0;
107.INA226_SetRegPointeraddr,CAL_REG;
108.temp=INA226_ReadDataaddr;
109.return ul6temp;
110.}
111.
112.//
1.25mV/bit
113.ul6INA226_GetVoltageu8addr
114.{
115.u32temp=0;
116.INA226_SetRegPointeraddr,BV_REG;
117.temp=INA226_ReadDataaddr;
118.return ul6temp;
119.}
120.
121.
122.
123.//
2.5uV/btt,感觉这个值是测不准的,所以下面改成
2.2了
124.ul6INA226_GetShuntVoltageu8addr
125.{
126.intl6_t temp=0;
127.INA226_SetRegPointeraddr,SV_REG;
128.temp=INA226_ReadDataaddr;
129.iftemp0x8000temp=~temp-1;
130.return ul6temp;
131.}
132.
133.134U16INA226_Get_Poweru8addr{intl6_t temp=0;.INA226_SetRegPointeraddr PWR_REG;J135temp=INA226_ReadDataaddr;return.ul6temp;
136.}
137.
138.
142.
139143.void GetVoltagefloat*Voltage///wl/.
144.{
1401.
45.Voltage
[0]=INA226_GetVoltageINA226_ADDRl*
1.25f;
114461.}.
147.
148.149void Get_Shunt_volt agefloat*Voltage//ul/.
150.{
151.Voltage
[0]=INA226_GetShuntVoltageINA226_ADDRl*
2.
22.
5152.}
153.
154.155void Get_Shunt_Currentfloat*Current//w
4.
156.Current
[0]=INA226_GetShunt_CurrentINA226_ADDR1*
2.5f;
158.
159.
160.161void GetPower///.V
162.163GetVoltageINA226_data.voltageVal;//mV.164Get_Shunt_voltageINA226_data.Shunt_voltage;//uV.165Get_Shunt_CurrentINA226_data.Shunt_Current;//mA.166INA226_data.powerVal=INA226_data.voltageVal*©.001f*.INA226_data.Shunt_Current*
0.001f;
167.
168.169/*.170void Get_Poi^erfLoat^Current//\A!.
171.172Current
[0]=.INA226_Get_PoiA/erINA226_ADDRl*50;
173.
174.ina
226.h1#ifndef INA226H.2#define INA226H.3#include sys.h.4#include“myiic.h.
5.
6.7#define CFGREG0x00//.8#define SVREG0x01//分流电压,此处分流电阻为,1欧.9#define BVREG0x02//总线电压.
10.#define PWRREG0x03//电源功率
11.#define CURREG0x04//电流
12.#define CALREG0x05//校准,设定满量程范围以及电流和功率测数的
13.#define ONFFREG0x
0614.#define AL_REG0x07//包含与所选警报功能相比较的限定值
15.#define INA226_GET_ADDR0XFF//包含唯一的芯片标识号
16.#define INA226_ADDR10x
8017.
18.INA226_GETALADDR0x14//^define
19.typedef struct
20.{
21.float voltageVal;//mV
22.float Shunt_voltage;//uV
23.float Shunt_Current;//mA
24.float powerVal;
25.}INA226;
26.
27.
28.void INA226_Initvoid;
29.void INA226_SetRegPointeru8addr,u8reg;
30.void INA226_SendDatau8addr^u8reg^ul6data;
31.
32.ul6INA226_ReadDatau8addr;
33.//u8INA226_ALertAddrvoid;
34.U16INA226_Get_IDu8addr;//获取td//获取总线电压
35.U16INA226_GetVoltage u8addr;
36.ul6INA226_GetShunt_Currentu8addr;//获取分流电流
37.ul6INA226_GetShuntVoltageu8addr;//分流电压
38.U16INA226_Get_Poweru8addr;//获取功率
39.
40.U16INA226_GET_CAL_REGu8addr;
41.void GetVoltagefloat*Voltage;
42.void Get_Shunt_voltagefloat Current;
43.void Get_Shunt_Currentfloat Current;
44.//void Get_Poi^erfLoat*Current;
45.void GetPower;///V
46.
47.extern INA226INA226_data;
48.#endif
49.模拟:使用官方库提供的通道iic iiciic.c
1.#include myiic.h
2.#include delay.h
3.//////////////////////////////////////////////////////////////////////////////////
4.//本程序只供学习使用,未经作者许可,不得用于其它任何用途
5.//ALIENTEK STM32F429开发板//□<驱动代码
6.
7.//正点原竞ALIENTEK8・//技术论坛:www・opened^,com
9.//创建日期2016/1/
1310.//版本V//版权所有,盗版必究
12.//CopyrightC广州市星翼电子科技有限公司2014-
202413.//ALL rightsreserved
14.//////////////////////////////////////////////////////////////////////////////////
15.
16.//IIC初始化
17.void IIC_Initvoid
18.{19•GPIO_InitTypeDef GPIO_Initure;
20.
21.._HAL_RCC_GPIOH_CLK_ENABLE;//使能GP工OH时钟
22.
23.//PH4,5初始化设置
24.GPIO_Initure.Pin=GPI0_PIN_4|GPIO_PIN_5;
25.GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;//推挽输出//上拉
26.GPIO_Initure.Pull=GPIO_PULLUP;
27.GPIO__Initure.Speed=GPIO_SPEED_FAST;//快速
28.HAL_GPIO_InitGPIOH,GPIO_Initure;
29.
30.IIC_SDA=1;
31.IIC_SCL=1;
32.}
33.
34.//产生口C起始信号
35.void IIC_Startvoid
36.
37.SDA_OUT;//sda线输出
38.IIC_SDA=1;
39.IIC_SCL=1;
40.delay_us4;
41.IICJSD/\=Q;//START:i\ihenCLK is highjDATA changeform highto low
42.delay_us4;
43.YlCfCL=0/钳住工2c总线,准备发送或接收数据
44.}//产生工工,停止信号
45.
46.void IIC_Stopvoid
47.{
48..SDA_OUT;//sda线输出
49.IIC_SCL=0;
50.IIC_SDA=0;//STOP:i^hen CLKishighDATA changeform lowto high
51.delay_us4;
52.IIC_SCL=1;
53.delay_us4;
54.\//发送工2c总线结束信号
55.}
56.//等待应答信号到来
57.//返回值1,接收应答失败,接收应答成功
58.//
59.u8IIC_Wait_Ackvoid
60.{
61.u8ucErrTime=0;
62.SDA_IN;//SD4设置为输入
63.IIC_SDA=1;delay_us1;
64.IIC_SCL=l;delay_usl;
65.whileREAD_SDA{
66.ucErrTime++;
67.ifucErrTime250{
68.IIC_Stop;
69.return1;
70.}
71.}
72.
73.
74.工工C_SCL=0;〃尼檄觞出
75.return0;
76.}
77.//产生4CK应答
78.void IIC_Ackvoid
79.{
80.IIC_SCL=0;
81.SDA_OUT;
82.IIC_SDA=0;
83.delay_us2;
84.IIC_SCL=1;
85.delay_us2;
86.IIC_SCL=0;
87.
88.//不产生4CK应答
89.void IIC_NAckvoid
90.{
91.IIC_SCL=0;
92.SDA_OUT;
93.IIC_SDA=1;
94.delay_us2;
95.IIC_SCL=1;
96.delay_us2;
97.IIC_SCL=0;
98.
99.//IIC发送一个字节。
个人认证
优秀文档
获得点赞 0