- 2025-01-15
-
回复了主题帖:
【极海APM32M3514电机通用评估板】使用APM32M3514的FOC SDK包驱动电机
Jacktang 发表于 2025-1-6 07:45
看了楼主的介绍,大概明白了什么是FOC,FOC的的原理,也明白了电机参数的性能
谢谢!我也是在学习中
- 2025-01-04
-
回复了主题帖:
【极海APM32M3514电机通用评估板】高级定时器TMR1的中断与刹车中断测试
nmg 发表于 2024-12-31 17:36
涉及到代码的地方,使用编辑器的 代码嵌入功能吧,平铺看起来会乱一些
OK
-
回复了主题帖:
测评汇总:极海APM32M3514电机通用评估板
【极海APM32M3514电机通用评估板】使用APM32M3514的FOC SDK包驱动电机 - 国产芯片交流 - 电子工程世界-论坛,+1
-
发表了主题帖:
【极海APM32M3514电机通用评估板】使用APM32M3514的FOC SDK包驱动电机
本帖最后由 lang518899 于 2025-1-4 21:04 编辑
1.什么是FOC
FOC是Field Oriented Control(磁场定向控制)电机控制技术,也称矢量控制,可以提高 电机的效率,控制稳定性和精度,广泛用于无刷直流电机(BLDC),永磁同步电机(PMS),感应电机等。
优点:
是精度高,平稳性好,高效性和可扩展性。
缺点:
是对实时性要求高,成本高,复杂性高且需要准确的电机参数,否则会影响控制效果
2.FOC框图及原理
2.1.FOC功能框图
从框图中可以看出主要涉及电流PID,电压PID,Clark变换,PARK变换,PARK逆变换、Clarke逆变换和位置与速度估算器几部分。
2.2.FOC原理
在启动时,采集a,b两相电流,经过Clarke变换后,得到两轴正交电流量,将经理变换后得到的正交电流量Id, Iq,其中Iq与转矩有关,Id与磁通有关,与输入参考一起分别送到PI调节器,得到Vq和Vd,再经过Park逆变换,得到Va和Vβ,这两个量送到位置与速度估算器得到速度和电机位置,同时送到Clark逆变换得到实际需要的三相电压给逆变桥,驱动电机转动。
3. APM32M3514 FOC驱动SDK的电机参数配置
通过上述介绍,知道了什么是FOC,FOC的基本原理,也明白了电机参数的重要性,下面我将根据我手上的电机参数对SDK进行适配,并驱动电机。
3.1.BLDC电机参数
我使用的电机是时代超群的57BL75S10-230TF9,24VDC,3000RPM, 100W具体参数如图
电机的接线如下:
3.2.SDK中参数的适配
该SDK包的参数配置在User/Inc下的Parameter.h文件中,
3.2.1.配置主频,PWM频率,采样电阻,参考电压及速度调节旋钮的有效值范围等值宏如下所示
3.2.2.电机的参数配置及调节,如下图所示
3.2.3.电机的速度范围配置,过流保护及速度环调节值限制,偏置保护电压设置等
4.电机启动参数适配中遇到问题
4.1,常见问题1:电机参数适配后,调节速度旋钮启动电机,电机无法启动或者抖动。
我在适配参数后,遇到电机无法启动且电机抖动,有时也会出现左右来回转一下,通过查询网上的文章和熟悉FOC算法后,在确认电机参数正确后,怀疑是Id和Iq的初始化参数不适配,导致电机在启动时,强拖电机,又于磁场差值小,导致启动失败,这个时候加大Id和Iq的差值,强行扡动电机运行。故修改Id和Iq,不断尝试,最终让电机正常运行。
4.2.电机启动转速不平稳
通过观察分析,发现电机在启动后,突然转速上升很快,然后又降下,这样反复几次后,速度才能稳定下来,经过分析,是速度环的PID参数配置有问题,于是用示波器查看三相电压输出波形,调度PID参数,就可以解决该问题,如果没有示波器,也可以使用听转速声音的方法,解决该问题。
5.电机整机运行图
所有参数调试正常后,运行如视频所示,启动也平稳。
[localvideo]9b4b22c551848acd6969b8a94c77fe2f[/localvideo]
-
回复了主题帖:
【极海APM32M3514电机通用评估板】高级定时器TMR1的中断与刹车中断测试
nmg 发表于 2024-12-31 17:36
涉及到代码的地方,使用编辑器的 代码嵌入功能吧,平铺看起来会乱一些
好的,下次注意
- 2024-12-23
-
发表了主题帖:
【极海APM32M3514电机通用评估板】高级定时器TMR1的中断与刹车中断测试
APM32M3514高级定时器
一.APM32M3514高级定时器(TMR1)简介
高级定时器 TMR1 以时基单元为核心,拥有输入捕获、输出比较和刹车输入等功 能,含有一个 16 位的自动装载计数器。高级定时器含有互补输出、重复计数以 及可编程的死区插入等功能,更加适合用于电机的控制。
1.TMR1的功能框图
2.主要特征和功能
①.时基单元,采用16位计数器,可以向上、向下和中央对齐计数,带16位预分频和16位的重复计数器,并带自动重装功能。
②.拥有丰富的时钟源选择,有内部时钟、外部输入、外部触发、内部触发。
③.输入捕获功能,可以实现计数,PWM输入(脉冲宽度、频率和占空比测量)和编码器接口输入
④.输出比较功能,PWM输出模式、强制输出模式、单脉冲模式和互补输出与死区插入。
⑤、定时功能
⑥、刹车功能
⑦、定时器的主/从模式控制,支持定时器之间可以同步和级联,支持多种从模式和同步信号
⑧、中断输出和DMA请求事件,更新事件、触发事件、捕获/比较事件、刹车信号输入事件。
3.寄存器地址映射
二、TMR1软件开发与讲解
1.TMR1初始化
1.1.初始化函数
Drv_TMR1_Init(PWM_PERIOD,DEAD_TIME);//调用TMR1初始化函数
初始化函数的实现如下:
/*初始化TMR1的外围时钟*/
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG | RCM_APB2_PERIPH_TMR1 );
TIM_TimeBaseInitStructure.period = (SYSTEM_FREQUENCY/2/2000);设置定时器周期
TIM_TimeBaseInitStructure.div = 0;//设置定时器分频
TIM_TimeBaseInitStructure.counterMode = TMR_COUNTER_MODE_CENTERALIGNED2;//设置定时器计数模式为中间对齐。
TIM_TimeBaseInitStructure.clockDivision = TMR_CKD_DIV1;//设置时钟分频
TIM_TimeBaseInitStructure.repetitionCounter = 1;//配置重复计数器值
TMR_ConfigTimeBase(TMR1, &TIM_TimeBaseInitStructure);//初始化定时器
TIM_BDTRInitStructure.RMOS_State = TMR_RMOS_STATE_ENABLE;//设置运行模式下的状态
TIM_BDTRInitStructure.IMOS_State = TMR_IMOS_STATE_ENABLE;//设置空闲模式下的状态
TIM_BDTRInitStructure.lockLevel = TMR_LOCK_LEVEL_OFF;//00:锁定关闭,寄存器无写保护;01:锁定级别1,不能写入TIMx_BDTR寄存器的DTG、BKE、BKP、AOE位和TIMx_CR2寄存器的OISx/OISxN位;
TIM_BDTRInitStructure.deadTime = u16_DeadTime;//死区时间
TIM_BDTRInitStructure.breakState = TMR_BREAK_STATE_ENABLE; //设置刹车状态
TIM_BDTRInitStructure.breakPolarity = TMR_BREAK_POLARITY_HIGH;//设置刹车信号极性
TIM_BDTRInitStructure.automaticOutput = TMR_AUTOMATIC_OUTPUT_DISABLE;//关闭自动输出状态
TMR_ConfigBDT(TMR1, &TIM_BDTRInitStructure);//设计 刹车寄存器
TIM_OCInitStructure.OC_Mode = TMR_OC_MODE_PWM2;//选择定时器模式为PWM2
TIM_OCInitStructure.OC_OutputState = TMR_OUTPUT_STATE_ENABLE; //配置定时器输出状态
TIM_OCInitStructure.OC_OutputNState = TMR_OUTPUT_NSTATE_ENABLE; //配置补偿端的状态
TIM_OCInitStructure.Pulse = u16_Period;//配置定时器周期
TIM_OCInitStructure.OC_Polarity = TMR_OC_POLARITY_HIGH;//配置信号极性
TIM_OCInitStructure.OC_NPolarity = TMR_OC_NPOLARITY_HIGH; //互补输出极性-------
TIM_OCInitStructure.OC_Idlestate = TMR_OCIDLESTATE_RESET; // 空闲状态
TIM_OCInitStructure.OC_NIdlestate = TMR_OCNIDLESTATE_RESET; // 补偿端的空闲状态
TMR_OC1Config(TMR1, &TIM_OCInitStructure);初始化TMR1定时器和补偿端
……
TMR_OC4Config(TMR1, &TIM_OCInitStructure);//OC4
//enable interrupt
TMR_EnableInterrupt(TMR1, TMR_INT_BRK);//开启中断
TMR_EnableInterrupt(TMR1, TMR_INT_CH4); //开启通道4的中断
TMR_EnableAUTOReload(TMR1);//TIMx_ARR寄存器被装入缓冲器
TMR_OC1PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE);//允许比较1预装值
TMR_OC2PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE);// 允许比较2值预装载使能
TMR_OC3PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE); /允许比较3值预装载使能
TMR_OC4PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE); 允许比较3值预装载使能,第4通道用作定时器中断,用于采集霍尔传感器状态读取和使用六步换相法时,进行换相操作。
TMR_EnableAUTOReload(TMR1);//允许TMR1自动重装
TMR_Enable(TMR1);//开启TMR1
TMR1->REPCNT = 1;//允许重装次数
TMR_EnablePWMOutputs(TMR1); 允许tmr1的PWM输出
/*下例为初始化PWM的输出引脚*/
GPIO_InitStructure.pin = GPIO_PIN_PWM_UH_Mobile;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AF;
GPIO_InitStructure.pupd = GPIO_PUPD_PD;
GPIO_Config(GPIO_PWM_UH_Mobile, &GPIO_InitStructure);
……
/*设置复用引脚的模式为PWM输出,设置完三路输出和三路互补输出*/
GPIO_ConfigPinAF(GPIO_PWM_UH_Mobile,GPIO_PIN_SOURCE_PWM_UH_Mobile,GPIO_AF_PIN2);
……
GPIO_ConfigPinAF(GPIO_PWM_Break_Mobile,GPIO_PIN_SOURCE_PWM_Break_Mobile,GPIO_AF_PIN3);
设置刹车信号引脚
1.2.比较器值的设置
/*调用比较器值函数如下**
Drv_TMR1_CompareConfig(PWM_PERIOD, PWM_PERIOD, PWM_PERIOD, PWM_PERIOD, PWM_PERIOD, PWM_PERIOD);
实现内容如下:
void Drv_TMR1_CompareConfig(uint16_t usCmpA,uint16_t usCmpB,uint16_t usCmpC,uint16_t usCmpnA,uint16_t usCmpnB,uint16_t usCmpnC)
{
PWM_CMPR1 = usCmpA;//设置A相比较值点
PWM_CMPR2 = usCmpB;// 设置B相比较值点
PWM_CMPR3 = usCmpC;// 设置C相比较值点
PWM_CMPR1_CC1C = usCmpnA;// 设置A相互补端比较值点
PWM_CMPR2_CC2C = usCmpnB;// 设置B相互补端比较值点
PWM_CMPR3_CC3C = usCmpnC;// 设置C相互补端比较值点
}
1.3.TMR1中断初始化
#define TIM_FLAG_Break ((uint16_t)0x0080)
#define TIM_FLAG_CC4 ((uint16_t)0x0010)
__enable_irq(); //Enable all interrupts开启所有中断
void Interrupt_Init(void)
{
/* Configure one bit for preemption priority配置一位的抢占优先级 */
SCB->AIRCR = (uint32_t)0x05FA0500;
NVIC_EnableIRQ(TMR1_CC_IRQn);//开启TMR1的中断请求
NVIC_SetPriority(TMR1_CC_IRQn,0);//开启TMR的刹车中断请求优先级
NVIC_EnableIRQ(TMR1_BRK_UP_TRG_COM_IRQn);//开启TMR的刹车中断请求
NVIC_SetPriority(TMR1_BRK_UP_TRG_COM_IRQn,0); //开启TMR的刹车中断请求优先级
TMR1->STS &= (uint16_t)0xFFFE;//实始化TMR1的状态寄存器
TMR1->STS &= (uint16_t)0xFF6F;
}
1.4.开启定时器
调用定时器开启函数,打开定时器
void TMR_EnablePWMOutputs(TMR_T* TMRx)
{
TMRx->BDT_B.MOEN = ENABLE;//开启tmr1的PWM输出
}
2.TMR1定时器中断函数实现
2.1.TMR1刹车中断
void TMR1_BRK_UP_TRG_COM_IRQHandler(void)
{
if ((TMR1->STS&TIM_FLAG_Break)==TIM_FLAG_Break)//判断TMR1的中断状态位,是否产生刹车中断
{
/*Hardware overcurrent protection*/
TMR1->STS &= (uint16_t)0xFF7F;//清除状态寄存器
Motor_type.User.stc_fault.u16_FaultFlg = OVER_CUR_HARD;//设置硬件过流
TIM1_PWMOutput(DISABLE);//关闭PWM输出
TMR1->BDT_B.MOEN = ENABLE;//寄存器模式配置,开启是运行模式,关闭是空闲模式
}
else if((TMR1->STS&TIM_FLAG_Update)==TIM_FLAG_Update)//是否是更新中断
{
TMR_ClearIntFlag(TMR1,TMR_INT_FLAG_UPDATE);//请除状态标志位
/* Counter overflow down*/
}
}
2.2. TMR1中断函数入口TMR1_CC_IRQHandler
void TMR1_CC_IRQHandler(void)
{
if ((TMR1->STS&TIM_FLAG_CC4)==TIM_FLAG_CC4)//判断是否时TMR1的四通道产生中断
{
TMR_ClearIntFlag(TMR1,TMR_INT_FLAG_CH4); //清除标志位
}
}
3.运行效果
- 2024-12-15
-
发表了主题帖:
【极海APM32M3514电机通用评估板】基于DMA的多通道ADC转换测试
由于该MCU和开发板主要针对电机,所以ADC的数据采集也是针对电机的数据进行采集,针对BLDC电机驱动,需要我们实时采集各项电流,电压,并对电流的过流,电压的欠压,过压进行判断,同时还需要电源电压,电机调速电位器等模拟量进行采集。
1.电机通用评估板的ADC采样电路如下:
1.1.电机三相IV,IU,IW电压采集电路,通过电阻分压,并使用稳压管进行I/O过压保护。
1.2.电机三相电流和总电流采集电路,通过APM32M3514自带的运算放大器进行放大,该示例中选用外部放大电阻。并通过一个运算放大器提供1.65V的参考电压。
1.3.输入电压和电阻可调旋钮的采集电路,
2.APM32M3514 MCU使用的ADC硬件电路使用通道介绍
2.1.电机三相电压采集ADC引脚,使用通道ADC_IN13,ADC_IN14,ADC_IN15,分别采集V,U,W三相。
1.2.PA0是采集参考电压,目前未使用,PA4,PB0和PB10分别采集IV相电流,IU相电流和ISUM总电流,
2.3.PA6用于采集输入电压,PA7用于采集可变电阻调节旋钮阻值变化
3.代码展示和讲解
3.1.ADC的IO及通道初始化
void Drv_Adc_Init(void)
{
ADC_Config_T ADC_InitStructure;
//ADC DMA Initial
DMA_Config_T DMA_InitStructure;
DMA_InitStructure.peripheralAddress = (uint32_t)&(ADC->DATA);//ADC地址
DMA_InitStructure.memoryAddress = (uint32_t)&ADC_ConvertedValue[0]; //内存地址
DMA_InitStructure.direction = DMA_DIR_PERIPHERAL; //方向(从外设到内存)
DMA_InitStructure.bufferSize = TOTAL_CHANNEL;//TOTAL_CHANNEL; //传输内容的大小---传输次数
DMA_InitStructure.peripheralInc = DMA_PERIPHERAL_INC_DISABLE; //外设地址固定
DMA_InitStructure.memoryInc = DMA_MEMORY_INC_ENABLE;//DMA_MEMORY_INC_ENABLE; //内存地址固定
DMA_InitStructure.peripheralDataSize = DMA_PERIPHERAL_DATASIZE_HALFWORD ; //外设数据单位
DMA_InitStructure.memoryDataSize = DMA_MEMORY_DATASIZE_HALFWORD ; //内存数据单位
DMA_InitStructure.circular = DMA_CIRCULAR_ENABLE ; //DMA模式:循环传输
DMA_InitStructure.priority = DMA_PRIORITY_LEVEL_VERYHIGH ; //优先级:高
DMA_InitStructure.memoryTomemory = DMA_M2M_DISABLE; //禁止内存到内存的传输
ADC_Reset();
DMA_Config(DMA_CHANNEL_1, &DMA_InitStructure); //配置DMA的1通道
DMA_Enable(DMA_CHANNEL_1);
ADC_ClockMode(ADC_CLOCK_MODE_ASYNCLK);//48M/4=12mADC_CLOCK_MODE_SYNCLKDIV4
/* Enable ADC clock */
// RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC);
ADC_ConfigStructInit(&ADC_InitStructure);
ADC_InitStructure.convMode = ADC_CONVERSION_SINGLE;
ADC_InitStructure.scanDir = ADC_SCAN_DIR_UPWARD;
ADC_InitStructure.extTrigConv1 = ADC_EXT_TRIG_CONV_TRG1; // timer1 CC4
ADC_InitStructure.extTrigEdge1 = ADC_EXT_TRIG_EDGE_RISING;
ADC_InitStructure.dataAlign = ADC_DATA_ALIGN_RIGHT;
ADC_InitStructure.resolution = ADC_RESOLUTION_12B;
ADC_Config(&ADC_InitStructure);
ADC_ConfigChannel(ADC_CHANNEL_2 | ADC_CHANNEL_8 | ADC_CHANNEL_6 | ADC_CHANNEL_7| ADC_CHANNEL_12| ADC_CHANNEL_13| ADC_CHANNEL_14| ADC_CHANNEL_15 ,ADC_SAMPLE_TIME_1_5);
ADC->CFG1_B.OVRMAG = 1;
ADC_EnableInterrupt(ADC_INT_CS);
//=========================ADC中断使用=================================================
NVIC_EnableIRQ(ADC_COMP_IRQn);//
NVIC_SetPriority(ADC_COMP_IRQn,0);
ADC_DMARequestMode(ADC_DMA_MODE_CIRCULAR);
ADC_EnableDMA();
ADC_Enable();
ADC_StartConversion();//必需要启动一下
/* Config ADC Channel GPIO */
GPIO_Config_T GPIO_InitStructure;
GPIO_InitStructure.pin = GPIO_Pin_ADC_VDC;//pin
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;//GPIO speed
GPIO_InitStructure.mode = GPIO_MODE_AN;//GPIO configured as analog input
GPIO_InitStructure.pupd = GPIO_PUPD_NO;//no pull-up and pull-down
GPIO_Config(GPIO_ADC_VDC, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_Handle;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_Handle, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_IU;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_IU, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_IV;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_IV, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_IBUS;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_IBUS, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_UV;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_UV, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_VV;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_VV, &GPIO_InitStructure);
GPIO_InitStructure.pin = GPIO_Pin_ADC_WV;
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AN;
GPIO_InitStructure.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIO_ADC_WV, &GPIO_InitStructure);
}
3.2.启动ADC转换
/* Wait until ADC is ready 等待ADC准备好*/
while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
ADC_StartConversion();//开启ADC转换
__enable_irq(); //Enable all interrupts
3.3.ADC中断
当产生中断时,读取ADC的转换结果,并将之保存,注意转换结果是按通道顺序排列。
uint16_t chnlvcur[50] = {0};
uint16_t chnlucur[50] = {0};
uint16_t chnlibus[50] = {0};
uint16_t chnluvol[50] = {0};
uint16_t chnlvvol[50] = {0};
uint16_t chnlwvol[50] = {0};
uint16_t chnlsvol[50] = {0};
uint16_t chnlinvol[50] = {0};
uint16_t i = 0;
void ADC_COMP_IRQHandler(void)
{
chnlvcur = (int16_t)ADC_GetValue(CURR_CHANNEL_V);
chnlucur = (int16_t)ADC_GetValue(CURR_CHANNEL_U);
chnlibus = (int16_t)ADC_GetValue(IBUS_CHANNEL);
chnlsvol = (int16_t)ADC_GetValue(Handle_CHANNEL);
chnlinvol = (int16_t)ADC_GetValue(VDC_CHANNEL);
chnluvol = (int16_t)ADC_GetValue(VOL_CHANNEL_U);
chnlvvol = (int16_t)ADC_GetValue(VOL_CHANNEL_V);
chnlwvol = (int16_t)ADC_GetValue(VOL_CHANNEL_W);
i++;
if(i>= 50)
{
i = 0;
}
}
}
4.代码运行结果查看
6.测试情况及数据
以下表电机工作时和不工作时,ADC采集的电压值作为比较,发现电机不工作时,这时电流波动较小,电压采集结果稳定,误差小。而在电机工作时,发现偶尔会出现电压值偏差很大,并且是正偏或负偏很大的值都偶尔出现,通过该测试可以发现,我们ADC在面对电流变化复杂的情况,不仅软件需要做滤波,硬件也需要处理好电源的突然变化。针对该评估板对动态输入电压对ADC的影响,可以每十组数据,去掉最大值和最小值,进行均值滤波,就可以将这种现象带来的误差减小到最小。
序号
输入电压(电机工作)
输入电压(电机不工作)
0
1360
1358
1
1352
1359
2
1362
1361
3
1361
1358
4
1361
1358
5
1361
1358
6
1355
1358
7
1359
1358
8
1360
1358
9
1361
1358
10
1361
1359
11
1360
1358
12
1525
1359
13
1348
1358
14
1367
1359
15
1358
1358
16
1371
1359
17
1752
1358
18
1328
1358
19
1361
1359
20
1360
1359
21
1361
1359
22
1361
1358
23
1359
1358
24
1399
1359
25
1361
1358
26
1361
1358
27
1361
1358
28
1360
1359
29
1360
1359
30
1361
1358
31
1361
1358
32
1361
1358
33
1361
1358
34
1120
1359
35
1359
1358
36
1356
1358
37
1363
1358
38
1347
1358
39
1247
1358
40
1715
1359
41
1198
1359
42
1361
1359
43
1361
1358
44
1361
1358
45
1361
1359
46
1357
1358
47
1362
1358
48
1361
1358
49
1361
1359
7.综合评价
通过这次测试,可以看出该芯片的ADC精度高,采样时间和采集值都表现不错。
- 2024-12-09
-
回复了主题帖:
极海APM32M3514串口使用PF0和PF1问题
IllusionXX 发表于 2024-12-9 10:51
电机开发板PF0和PF1接的是晶振,你这样可不得跑飞吗,看了一下官方就没有留出打印口,那我想知道测试总要打 ...
用内部晶振,他们CASE使用了串口,应该切换到内部晶振,
-
回复了主题帖:
极海APM32M3514串口使用PF0和PF1问题
不说我还真没有发现PF0,PF1接的晶振,那串口就没有使用了,我看PA2,PA3,PA9和PA10都已经被使用了,看到CH340上接的PF0和PF1,还跑去把引脚配置后,就跑飞了。那要用串口只能使用内部晶振了!
不过这硬件设计有点新颖。
让我措手不及了
谢谢各位了
- 2024-12-08
-
发表了主题帖:
极海APM32M3514串口使用PF0和PF1问题
各位高手及极海的FAE,我在使用极海的APM32M3514串口时遇到如下问题,
我使用的板子根据硬件电路将串口的引脚改为PF0和PF1的串口时,开启中串口中断,代码跑飞,引脚配置如下:
在初始化代码中,只要把串口1中断打开,程序跑飞,使用的是COM1 初始化如下:
void APM_MINI_COMInit(COM_T COM)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfigStruct;
/* Enable GPIO clock */
RCM_EnableAHBPeriphClock(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM]);
/* Enable COM1 or COM2 clock */
if (COM == COM1)
{
RCM_EnableAPB2PeriphClock(COM_USART_CLK[COM]);
}
else
{
RCM_EnableAPB1PeriphClock(COM_USART_CLK[COM]);
}
/* Connect PXx to USARTx_Tx */
GPIO_ConfigPinAF(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);
/* Connect PXx to USARTx_Rx */
GPIO_ConfigPinAF(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);
/* Configure USART Tx as alternate function push-pull */
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.pin = COM_TX_PIN[COM];
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.pupd = GPIO_PUPD_PU;
GPIO_Config(COM_TX_PORT[COM], &gpioConfig);
/* Configure USART Rx as input floating */
gpioConfig.pin = COM_RX_PIN[COM];
GPIO_Config(COM_RX_PORT[COM], &gpioConfig);
/* MINI_USARTs configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
usartConfigStruct.baudRate = 115200;
usartConfigStruct.mode = USART_MODE_TX_RX;
usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
usartConfigStruct.parity = USART_PARITY_NONE;
usartConfigStruct.stopBits = USART_STOP_BIT_1;
usartConfigStruct.wordLength = USART_WORD_LEN_8B;
USART_Config(COM_USART[COM], &usartConfigStruct);
/* Enable USART_Interrupt_RXBNEIE */
USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE);
if (COM_USART[COM] == USART1)
{
NVIC_EnableIRQRequest(USART1_IRQn, 2);
}
else if (COM_USART[COM] == USART2)
{
NVIC_EnableIRQRequest(USART2_IRQn, 3);
}
/* Enable USART */
// USART_Enable(USART1);
USART_Enable(COM_USART[COM]);
}
出错时调试报错如下:
请问一下谁知道这是什么原因
- 2024-12-07
-
发表了日志:
【极海APM32M3514电机通用评估板】开箱体验及环境搭建
-
发表了主题帖:
【极海APM32M3514电机通用评估板】开箱体验及环境搭建
本帖最后由 lang518899 于 2024-12-7 17:39 编辑
首先谢谢EEWORLD给予的BLDC无刷电机学习机会。
1.开发板及芯片简介
首先介绍一下极海APM32M3514芯片,该芯片是极海半导体针对电机控制推出的专用芯片,芯片采用32位的Arm Cortex-M0内核,最高72MHz工作频率支持单周期32位硬件乘法器,并封装了M0CP协处理器,可以实现硬件移位单元,32bit/32bit 除法器,可选带和的乘加运算,开方,三角函数,SVPWM等,64KbFlash和10KB SRAM(8+2(协处理器))一个12位13通道的ADC,一个16位高级定器器等等。
本次测试是极海基于APM32M3514芯片的开发板,外部有一个BLDC电机接口,一个24V供电接口,一个霍尔传感器接口,一个USB转串口,另外一个电位器,用于调节电机转速,一个正反转开关,一个Break开关,一个Fault指示灯。
收到包装如下图所示:
开发板正面图,可以看到绿色的电源接口,BLDC 电机接口,霍尔传感器接口,USB,电位器和切换开关等
背面只能看到走线,没有放置任何元器件
如下图所示,可以清晰的看到主控芯片的型号
2.测试环境搭建
由于很早准备了BLDC电机,我的电机型号是时代超群的57BL75S10,该电机支持24V,3000转,100W功率,带霍尔转感器,在收到开发板后,发现开发板的霍尔传感器接口,只支持3.3V,而我买的电机霍尔传感器接口是5V,很担心不能使用,于是查看芯片手册,发现霍尔传感器信号输入GPIO支持5V,那完全没有问题,环境搭好后,如下图所示:
如上图所示,将电机的U,V,W分别接到开发板的BLDC接口的U,V,W相上,再将霍尔传感器的Hu,Hv,Hw和GND分别与开发板的霍尔传感器接口相连接,由于板子没有5V,故我将5V接到仿真器的5V,供电24V后,整个电机测试环境搭好。
3.软件环境搭建:
3.1.在极海的官司网https://www.geehy.com/design/software,下载红色框中的SDK和Keil开发环境的pack包,
3.2.安装完成后,打开SDK包,如下图所示,由于Demo的LED灯引脚与PCB图不一致,需要我们更改GPIO引脚,更改后编译,下载
3.3.下载GPIO代码后,可以看到板上Fault灯,一闪一闪,
由于无法上传视频,就忽略
4.至此环境搭建完成,下面开始一步一步的测试。
- 2024-11-27
-
回复了主题帖:
测评入围名单:极海APM32M3514电机通用评估板
个人信息无误,确认可以完成测评分享计划
- 2024-11-14
-
回复了主题帖:
知识拆出来!EEWorld邀你来拆解(第16期)来啦~~~
很早以前做过车窗升降器,现在也在从事汽车电子嵌入式软件,对软硬件也熟悉,所以想参与拆解一下,了解现在控制器的硬件设计,硬件框架,器件造型等