打印
[其他ST产品]

基于STM32电压检测和电流检测

[复制链接]
楼主: 逢dududu必shu
手机看帖
扫描二维码
随时随地手机跟帖
21
逢dududu必shu|  楼主 | 2024-4-30 23:51 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 逢dududu必shu 于 2024-5-2 15:57 编辑

主函数:
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t count=0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //桥臂1和桥臂2使能
  HAL_GPIO_WritePin(GPIOC, EN1_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOC, EN2_Pin, GPIO_PIN_SET);

  

使用特权

评论回复
22
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:57 编辑

//PWM通道使能
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);

使用特权

评论回复
23
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:57 编辑

//开启ADC采集
  HAL_ADC_Start_DMA(&hadc1,(uint32_t*)Get_ADC,1000);

使用特权

评论回复
24
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:58 编辑

//初始化上位机
  debug_init();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if(KEY_Scany(KEY_GPIO_Port,KEY_Pin)==1)
          {
                  Duty+=5;
                  if(Duty>=100)
                          Duty=100;

                  TIM1->CCR1=Duty;
          }

使用特权

评论回复
25
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:58 编辑


          HAL_Delay(10);
          if(count%50==0)
          {
                  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
                  debug_send_wave_data(1,Get_Current);
                  debug_send_wave_data(2,Get_ADC_Val);

                  count=0;
          }
          count++;
  }
  /* USER CODE END 3 */
}

使用特权

评论回复
26
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:59 编辑

INA226模块驱动#include "sys.h"
#include "myiic.h"
#define         CFG_REG                         0x00                //
#define         SV_REG                         0x01                //分流电压
#define         BV_REG                         0x02                //总线电压
#define         PWR_REG                 0x03                //电源功率
#define         CUR_REG                 0x04                //电流
#define         CAL_REG                 0x05                //校准,设定满量程范围以及电流和功率测数的
#define         ONFF_REG                 0x06                //屏蔽 使能 警报配置和转换准备就绪
#define         AL_REG                         0x07                //包含与所选警报功能相比较的限定值
#define         INA226_GET_ADDR 0XFF                /
//初始化INA226

使用特权

评论回复
27
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:59 编辑


void INA226_Init(void)
{      


        IIC_Init();
        INA226_SendData(INA226_ADDR1,CFG_REG,0x8000);        //重新启动

        INA226_SendData(INA226_ADDR1,CFG_REG,0x484f);        //设置转换时间204us,求平均值次数128,采样时间为204*128,设置模式为分流和总线连续模式
        INA226_SendData(INA226_ADDR1,CAL_REG,CAL);        //设置分辨率
        //INA226_SendData(INA226_ADDR1,CAL_REG,0x0012);//设置分流电压转电流转换参数      
        INA226_Get_ID(INA226_ADDR1);                                        //获取ina226的id
}

使用特权

评论回复
28
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 15:59 编辑


//设置寄存器指针
void INA226_SetRegPointer(u8 addr,u8 reg)
{
        IIC_Start();


        IIC_Send_Byte(addr);
        IIC_Wait_Ack();


        IIC_Send_Byte(reg);
        IIC_Wait_Ack();


        IIC_Stop();
}


使用特权

评论回复
29
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:00 编辑

//发送,写入数据
void INA226_SendData(u8 addr,u8 reg,u16 data)
{
        u8 temp=0;
        IIC_Start();


        IIC_Send_Byte(addr);
        IIC_Wait_Ack();


        IIC_Send_Byte(reg);
        IIC_Wait_Ack();

        temp = (u8)(data>>8);
        IIC_Send_Byte(temp);
        IIC_Wait_Ack();


        temp = (u8)(data&0x00FF);
        IIC_Send_Byte(temp);
        IIC_Wait_Ack();

        IIC_Stop();
}


使用特权

评论回复
30
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:00 编辑

//读取数据
u16 INA226_ReadData(u8 addr)
{
        u16 temp=0;
        IIC_Start();


        IIC_Send_Byte(addr+1);
        IIC_Wait_Ack();

        temp = IIC_Read_Byte(1);
        temp<<=8;      
        temp |= IIC_Read_Byte(0);

        IIC_Stop();
        return temp;
}

使用特权

评论回复
31
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:00 编辑


//1mA/bit
u16 INA226_GetShunt_Current(u8 addr)
{
        u16 temp=0;      
        INA226_SetRegPointer(addr,CUR_REG);
        temp = INA226_ReadData(addr);
        if(temp&0x8000)        temp = ~(temp - 1);      
        return temp;
}


使用特权

评论回复
32
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:00 编辑

//获取id
void INA226_Get_ID(u8 addr)
{
        u32 temp=0;
        INA226_SetRegPointer(addr,INA226_GET_ADDR);
        temp = INA226_ReadData(addr);
        ina226_data.ina226_id = temp;
}




使用特权

评论回复
33
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:01 编辑

//获取校准值
u16 INA226_GET_CAL_REG(u8 addr)
{      
        u32 temp=0;
        INA226_SetRegPointer(addr,CAL_REG);
        temp = INA226_ReadData(addr);
        return (u16)temp;
}


使用特权

评论回复
34
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:01 编辑


//1.25mV/bit
u16 INA226_GetVoltage(u8 addr)
{
        u32 temp = 0;
        INA226_SetRegPointer(addr,BV_REG);
        temp = INA226_ReadData(addr);
        return (u16)temp;      
}


使用特权

评论回复
35
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
本帖最后由 逢dududu必shu 于 2024-5-2 16:15 编辑

//获取电压
void GetVoltage(float *Voltage)//mV
{
        *Voltage = INA226_GetVoltage(INA226_ADDR1)*Voltage_LSB;
}

使用特权

评论回复
36
逢dududu必shu|  楼主 | 2024-4-30 23:52 | 只看该作者
主函数:
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t count=0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //桥臂1和桥臂2使能
  HAL_GPIO_WritePin(GPIOC, EN1_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOC, EN2_Pin, GPIO_PIN_SET);
  
  //PWM通道使能
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
  
  //开启ADC采集
  HAL_ADC_Start_DMA(&hadc1,(uint32_t*)Get_ADC,1000);
  
  //初始化上位机
  debug_init();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if(KEY_Scany(KEY_GPIO_Port,KEY_Pin)==1)
          {
                  Duty+=5;
                  if(Duty>=100)
                          Duty=100;
                  
                  TIM1->CCR1=Duty;
          }
         
          HAL_Delay(10);
          if(count%50==0)
          {
                  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
                  debug_send_wave_data(1,Get_Current);
                  debug_send_wave_data(2,Get_ADC_Val);
  
                  count=0;
          }
          count++;
  }
  /* USER CODE END 3 */
}

使用特权

评论回复
37
逢dududu必shu|  楼主 | 2024-5-2 00:57 | 只看该作者
应用层开发
主函数:
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t count=0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //桥臂1和桥臂2使能
  HAL_GPIO_WritePin(GPIOC, EN1_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOC, EN2_Pin, GPIO_PIN_SET);
  
  //PWM通道使能
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
  
  //开启ADC采集
  HAL_ADC_Start_DMA(&hadc1,(uint32_t*)Get_ADC,1000);
  
  //初始化上位机
  debug_init();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if(KEY_Scany(KEY_GPIO_Port,KEY_Pin)==1)
          {
                  Duty+=5;
                  if(Duty>=100)
                          Duty=100;
                  
                  TIM1->CCR1=Duty;
          }
          
          HAL_Delay(10);
          if(count%50==0)
          {
                  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
                  debug_send_wave_data(1,Get_Current);
                  debug_send_wave_data(2,Get_ADC_Val);
  
                  count=0;
          }
          count++;
  }
  /* USER CODE END 3 */
}

使用特权

评论回复
38
逢dududu必shu|  楼主 | 2024-5-2 00:57 | 只看该作者
按键扫描函数KEY_Scany
/* USER CODE BEGIN 2 */
uint8_t KEY_Scany(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
        if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==0)
        {
                while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==0);
                return 1;
        }
        else
                return 0;
}
/* USER CODE END 2 */

使用特权

评论回复
39
逢dududu必shu|  楼主 | 2024-5-2 00:57 | 只看该作者
中断函数:
/* USER CODE BEGIN 1 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
        uint32_t temp=0;
        int i;
        HAL_ADC_Stop_DMA(hadc);  //停止ADC采集,计算采集电流
       
        for(i=0;i<1000;i++)      //采集1000次取平均
        {
                temp+=Get_ADC[i];
        }
       
        temp/=1000;
       
        Get_ADC_Val=temp;
       
        Get_Current=(float)(Get_ADC_Val*(float)(3.3f/4.096f/0.99f));  //计算电流值
       
    HAL_ADC_Start_DMA(&hadc1,(uint32_t*)Get_ADC,1000);        //开启ADC采集
}
/* USER CODE END 1 */

使用特权

评论回复
40
逢dududu必shu|  楼主 | 2024-5-2 00:58 | 只看该作者
中断函数:
/* USER CODE BEGIN 1 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
        uint32_t temp=0;
        int i;
        HAL_ADC_Stop_DMA(hadc);  //停止ADC采集,计算采集电流
       
        for(i=0;i<1000;i++)      //采集1000次取平均
        {
                temp+=Get_ADC[i];
        }
       
        temp/=1000;
       
        Get_ADC_Val=temp;
       
        Get_Current=(float)(Get_ADC_Val*(float)(3.3f/4.096f/0.99f));  //计算电流值
       
    HAL_ADC_Start_DMA(&hadc1,(uint32_t*)Get_ADC,1000);        //开启ADC采集
}
/* USER CODE END 1 */

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则