本帖最后由 superwoman 于 2025-2-6 16:54 编辑

开发板基本介绍

元能芯重磅推出了一款国内少有的全集成明星产品【聚于一芯卓尔不凡】--MYi0002V0405。该产品集MCU、Driver、MOSFET于一体,集成式设计可将整个板子面积至少缩小50%以上,完美解决体积、贴片、散热等痛点,广泛应用于风机、小水泵,及汽车热管理系统,给客户提供更好的可靠性之外,还有降成本优势。产品内阻约55毫欧,在电流一样的情况下,友商同类产品产生的热量至少是元能芯产品的3-5倍。能够有效较低终端在散热和电路板面积方面的难题,解决终端设备因过热而引发产品故障、寿命缩短的问题;满足终端设备小型化的需求。基于该产品开发的方案能将复杂的电路板从双面、四层板优化成单面板,客户可以快速生产出性能稳定、高良率的产品。元能芯All in one芯片,是以MCU为主控,集成了Gate Driver、MOSET等关键器件于同一个封装内,减少了外部组件和布线,从而降低了系统的整体复杂性和成本,可应用于小功率无刷电机市场。

产品所采用的关键技术:

1、采用先进封装--面板级封装FOPLP,可有效降低功率损耗,以提高散热效率;

2、采用更高性能的MCU,提高电机算法和数据的处理速度;

3、采用更全电压段Gate Driver,能够适应不同电压需求的栅极驱动器,以支持多种电源配置;

4、采用更先进工艺技术、更小特征尺寸的MOSET,以减少器件的内阻;同时改进MOSFET的布局设计,减少寄生电阻和电容;

5、采用更先进的热管理技术:使用导热性能好的材料,来提高热量从芯片到封装的传递效率。

1738831161390.png

资料&手册下载

打开如下官网:

image.png

选择资料下载

image.png

下图中的资料和文档全部下载下来


image.png

Keil pack安装

双击如下文件,系统自动安装。不要随意更改位置,这个和keil自动关联的。

image.png

学习目标

根据原理图,我们操作LED和滑动电阻。结合这种情况。

通过ADC采集滑动电阻的分压电压,当电压超过1.65V时,LED D5灭。

当电压低于1.65V时,LED D5亮。

如下原理图所示:

image.png

可以看到,当PC5输出高电平,D5灭。当PC5输出低电平时,D5亮。

通过PD3采集R18的分压电压。


通过手册查找PD3管脚,如下图所示:

image.png

建立工程&编码

选择ADC的例程,可以简化初始工程的建立。

修改main.c文件,如下图所示:

<pre>/**
  •   ******************************************************************************
  •   * @file           : main.c
  •   * @brief          : Main program body
  •   ******************************************************************************
  •   * @attention
  •   *
  •   */

  • /* Includes ------------------------------------------------------------------*/
  • #include "main.h"
  • #include "myg0002.h"
  • #include "myg0002_gpio.h"
  • #include <stdio.h>
  • #include "stdarg.h"

  • ADC_InitTypeDef ADC_InitStructure;
  • USART_InitTypeDef USART_InitStructure;
  • NVIC_InitTypeDef    NVIC_InitStructure;
  • uint32_t  ADCConvertedValue = 0;
  • static void softWareDelay(uint32_t ms);
  • float ADCConvertedVoltage = 0;
  • void RCC_Configuration(void);
  • void GPIO_Configuration(void);
  • void ADC_Configuration(void);
  • void USART_Configuration(void);
  • int fputc(int ch, FILE *f);
  • void USART1_printf(USART_TypeDef *USARTx, uint8_t *Data, ...);

  • int main(void)
  • /* Infinite loop */
  • {
  •     RCC_Configuration();
  •                 softWareDelay(9000);
  •        
  •     GPIO_Configuration();
  •     ADC_Configuration();
  • //    USART_Configuration();
  •     softWareDelay(1000);
  •     while (1)
  •     {
  •         softWareDelay(1000);
  •         while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  •         ADCConvertedValue = ADC_GetConversionValue(ADC1);
  •         ADCConvertedVoltage = (ADCConvertedValue * 3.3) / 4095; //计算ADC转换电压值
  • //        printf("ADC_DR register of CH2:0x%04X \n", ADCConvertedValue); //打印寄存器值
  • //        printf("ADC_V of CH2:%f V\n", ADCConvertedVoltage); //打印电压
  •                                 if(ADCConvertedValue>2048)
  •                                         GPIO_SetBits(GPIOC,GPIO_Pin_5);
  •                                 else GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  •     }
  • }
  • /*软件延时*/
  • //static void softWareDelay(void)
  • //{
  • //    uint16_t i;
  • //    uint16_t j;

  • //    for (i = 0; i < 2000; i++)
  • //    {
  • //        for (j = 0; j < 1000; j++)
  • //        {
  • //            __NOP();
  • //        }
  • //    }
  • //}
  • static void softWareDelay(uint32_t ms)
  • {
  •     uint16_t i;
  •     uint16_t j;

  •     for (i = 0; i < 1000; i++)
  •     {
  •         for (j = 0; j < ms; j++)
  •         {
  •             __NOP();
  •         }
  •     }
  • }
  • /*时钟初始化*/
  • void RCC_Configuration(void)
  • {
  •     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
  •     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  •     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
  • }
  • /*IO初始化*/
  • void GPIO_Configuration(void)
  • {
  •     //初始化模拟IO PD3-ain3
  •     GPIO_InitTypeDef GPIO_InitStructure;
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  •     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  •     GPIO_Init(GPIOD, &GPIO_InitStructure);
  •     GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_7);
  •     //初始化串口IO
  • //    //PD6,RX
  • //    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  • //    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  • //    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  • //    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  • //    GPIO_Init(GPIOD, &GPIO_InitStructure);
  • //    GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_1);
  •     //PD5,TX
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  •     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  •     GPIO_Init(GPIOD, &GPIO_InitStructure);
  •     GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_1);

  •     //PC5,led d5
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  •     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;               
  •                 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;;
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  •     GPIO_Init(GPIOC, &GPIO_InitStructure);
  •                
  • }
  • /*ADC配置*/
  • void ADC_Configuration(void)
  • {

  •     ADC_DeInit(ADC1);
  •     ADC_StructInit(&ADC_InitStructure);

  •     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  •     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
  •     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  •     ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  •     ADC_Init(ADC1, &ADC_InitStructure);
  •     /* ADC1 regular channels configuration */
  •     ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);
  •     //ADC_GetCalibrationFactor(ADC1);

  •     /* Enable ADC1 */
  •     ADC_Cmd(ADC1, ENABLE);

  •     while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
  •     ADC_StartOfConversion(ADC1);
  • }
  • /*串口配置*/
  • void USART_Configuration(void)
  • {
  •     USART_InitStructure.USART_BaudRate = 115200;
  •     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  •     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  •     USART_InitStructure.USART_Parity = USART_Parity_No;
  •     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  •     USART_InitStructure.USART_Mode = USART_Mode_Tx;
  •     USART_Init(USART1, &USART_InitStructure);
  •     USART_SWAPPinCmd(USART1, ENABLE);
  •     //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口发送完成中断
  •     USART_Cmd(USART1, ENABLE);

  • //    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  • //    NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
  • //    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  • //    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  • //    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
  • //    NVIC_Init(&NVIC_InitStructure);

  • }
  • /*printf重定义*/
  • int fputc(int ch, FILE *f)
  • {
  •     /* 发送一个字节数据到串口 */
  •     USART_SendData(USART1, (uint8_t) ch);

  •     /* 等待发送完毕 */
  •     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

  •     return (ch);
  • }
  • /*
  • * 函数名:itoa
  • * 描述  :将整型数据转换成字符串
  • * 输入  :-radix=10 表示十进制,其他结果为0
  •            -value 要转换的整型数
  • *         -string 转换后的字符串
  • * 输出  :无
  • * 调用  :由USART1_printf()调用
  • */
  • static char *itoa(int value, char *string, int radix)
  • {
  •     int  i, d;
  •     int  flag = 0;
  •     char *ptr = string;

  •     /* 此处仅支持十进制转换 */
  •     if (radix != 10)
  •     {
  •         *ptr = 0;
  •         return string;
  •     }

  •     if (!value)
  •     {
  •         *ptr++ = 0x30;
  •         *ptr = 0;
  •         return string;
  •     }

  •     /* 如果是一个负号,就加上“-”符号 */
  •     if (value < 0)
  •     {
  •         *ptr++ = '-';
  •         value *= -1;
  •     }
  •     for (i = 10000; i > 0; i /= 10)
  •     {
  •         d = value / i;
  •         if (d || flag)
  •         {
  •             *ptr++ = (char)(d + 0x30);
  •             value -= (d * i);
  •             flag = 1;
  •         }
  •     }

  •     /* 空终止字符. */
  •     *ptr = 0;
  •     return string;
  • }

  • /*
  • * 函数名:USART1_printf
  • * 描述  :格式化输出,类似于C 库中的printf,但这里没有用到C库
  • * 输入  :-USARTx 串口通道,这里只用到了串口1,即USART1
  • *         -Data 要发送到串口的内容的指针
  • * 输出  :无
  • * 调用  :外部调用
  • */
  • void USART1_printf(USART_TypeDef *USARTx, uint8_t *Data, ...)
  • {
  •     const char *s;
  •     int d;
  •     char buf[16];
  •     va_list ap;
  •     va_start(ap, Data);
  •     while (*Data != 0)          //判断是否到达字符串结束符
  •     {
  •         if (*Data == 0x5c)      //'\'
  •         {
  •             switch (*++Data)
  •             {
  •             case 'r':       //回车符
  •                 USART_SendData(USARTx, 0x0d);
  •                 Data++;
  •                 break;

  •             case 'n':       //换行符
  •                 USART_SendData(USARTx, 0x0a);
  •                 Data++;
  •                 break;
  •             default:
  •                 Data++;
  •                 break;
  •             }
  •         }
  •         else if (*Data == '%')
  •         {
  •             switch (*++Data)
  •             {
  •             case 's':       //字符串
  •                 s = va_arg(ap, const char *);
  •                 for (; *s; s++)
  •                 {
  •                     USART_SendData(USARTx, *s);
  •                     while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
  •                 }
  •                 Data++;
  •                 break;
  •             case 'd':       //十进制
  •                 d = va_arg(ap, int);
  •                 itoa(d, buf, 10);
  •                 for (s = buf; *s; s++)
  •                 {
  •                     USART_SendData(USARTx, *s);
  •                     while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
  •                 }
  •                 Data++;
  •                 break;
  •             default:
  •                 Data++;
  •                 break;
  •             }
  •         }
  •         else
  •         {
  •             USART_SendData(USARTx, *Data++);
  •         }
  •         while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
  •     }
  • }


  • #ifdef  USE_FULL_ASSERT
  • /**
  •   * @brief  Reports the name of the source file and the source line number
  •   *         where the assert_param error has occurred.
  •   * @param  file: pointer to the source file name
  •   * @param  line: assert_param error line source number
  •   * @retval None
  •   */
  • void assert_failed(uint8_t *file, uint32_t line)
  • {
  •     /* User can add his own implementation to report the file name and line number,
  •        tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  • }
  • #endif /* USE_FULL_ASSERT */


  • </pre>
  • 复制代码
    编译成功后显示:
    image.png

    程序下载

    image.png

    实验效果

    LED D5亮

    image.png

    LED D5灭

    image.png

    ADC变化时,LED变化情况: