本帖最后由 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、采用更先进的热管理技术:使用导热性能好的材料,来提高热量从芯片到封装的传递效率。
资料&手册下载
打开如下官网:
选择资料下载
下图中的资料和文档全部下载下来
Keil pack安装
双击如下文件,系统自动安装。不要随意更改位置,这个和keil自动关联的。
学习目标
根据原理图,我们操作LED和滑动电阻。结合这种情况。
通过ADC采集滑动电阻的分压电压,当电压超过1.65V时,LED D5灭。
当电压低于1.65V时,LED D5亮。
如下原理图所示:
可以看到,当PC5输出高电平,D5灭。当PC5输出低电平时,D5亮。
通过PD3采集R18的分压电压。
通过手册查找PD3管脚,如下图所示:
建立工程&编码
选择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>复制代码编译成功后显示:
程序下载
实验效果
LED D5亮
LED D5灭
ADC变化时,LED变化情况: