FOC Driver Board Archive慧驱动 FOC 驱动板归档
An archive-style project page for a sensorless PMSM FOC driver board line around STM32F4 and DRV8301, with selected manufacturing, EDA, STEP, datasheet, and source evidence published from the non-sensitive legacy folder.围绕 STM32F4 与 DRV8301 的无感 PMSM FOC 驱动板归档页,从非敏感 legacy 目录中发布筛选后的制造、EDA、STEP、数据手册和源码证据。
- Timeline时间线
- 2025.11 - 2026.032025.11 - 2026.03
- Status状态
- Public Archive公开归档
- Stack技术栈
- FOCMotor ControlSTM32F4DRV8301PCB

Project Brief项目简述
This line is useful motor-control material rather than a finished public release. The source folder contains a sensorless PMSM FOC board, STM32F4 firmware, DRV8301 driver work, motor-control source modules, datasheets, BOM/PnP exports, a STEP model, an EasyEDA project, and generated build folders. Because this is a non-sensitive legacy folder, selected files are linked publicly; the page still avoids pretending that a file dump is the same thing as a validated FOC case study.
更准确地说,它现在是“方向已经有了,调试还没讲透”。FOC 很适合放作品集,因为关键词漂亮:三相驱动、无感控制、Clarke/Park、SVPWM、电流采样、速度环、保护逻辑、DRV8301、STM32F4。问题是,如果只把 Gerber、BOM、STEP 和源码堆上来,看起来很硬,实际并没有解释清楚板子怎么起转、怎么保护、波形是否稳定、调参过程有没有闭环。

Archive Scope归档范围
- Hardware line: a sensorless PMSM FOC driver board, with selected BOM, pick-and-place, Gerber, STEP, and EasyEDA project files now published as legacy evidence.
- Firmware line: STM32F4 project with
motor/modules such asadc,drv8301,foc_algorithm,hall_sensor,speed_pid, and parameter-identification wrappers. - Toolchain line: IAR / Keil project files, CMSIS / STM32F4 library material, Debug / Release build output, and vendor documentation.
- Reference line: DRV8301, STM32F446RE, MOSFET, encoder, and CMSIS references.
How The Files Are Used文件怎么用
The site serves selected FOC board files because the source is from a legacy project line, not from the two Current_Product folders. The files are useful for showing what exists: schematic/manufacturing outputs, the EasyEDA project, the STEP model, driver references, and selected motor-control source files. It still needs redrawn diagrams, test screenshots, oscilloscope captures, current-sampling notes, startup-state explanation, and tuning logs before it becomes a strong engineering case study.
现在把这条线当材料页保留下来,不硬装成“完整量产级驱动器”。等后面补到波形、日志和调参记录,再写成真正的 case study 会更稳。
Board Render And Schematic Sheets板卡渲染与分页原理图
The new render and schematic sheets make the archive much less abstract. The 3D view gives the board density, high-current terminal area, DRV8301-side layout, user controls, and silkscreen context; the five schematic sheets split the design into MCU, connector, ADC, MOSFET power stage, and driver sections.
这次补的几张图比单纯列文件有用。3D 渲染图先把板子的密度、高电流端子、DRV8301 一侧、按键和丝印位置摆出来;五张分页原理图再把 MCU、连接器、ADC、MOS 功率级和驱动部分拆开看。现在至少能顺着图从“板子长什么样”读到“每个电路块大概在哪”。





Files文件
- FOC board 3D render
- FOC MCU schematic sheet
- FOC connector schematic sheet
- FOC ADC schematic sheet
- FOC MOSFET stage schematic sheet
- FOC driver schematic sheet
- EasyEDA project
- Gerber archive
- BOM table
- Pick-and-place table
- Interactive BOM
- PCB 3D STEP model
- Board configuration source
- Motor ADC source
- DRV8301 driver source
- FOC algorithm source
- Hall sensor source
- Speed PID source
- PC communication init source
- DRV8301 datasheet
- HY3010D MOSFET datasheet
What Stayed Out没放上来的东西
Still not published from the source archive:
- full STM32F4 firmware source tree;
- IAR / Keil project folders;
- CMSIS / STM32F4 vendor library folders;
- Debug / Release build outputs;
- duplicate generated exports and tool caches.
Missing Debug Notes还缺的调试记录
- A redrawn FOC signal path from phase current sampling to Park / Clarke transform, PI loops, SVPWM, and gate-driver output.
- Startup and protection notes: pre-charge, alignment, fault pin handling, over-current assumptions, and DRV8301 status reading.
- Test evidence: phase-current waveforms, PWM timing, speed response, failed startup cases, and parameter-tuning notes.
Looking Back现在回头看
The main risk of this line is that it looks advanced, so it becomes easy to write around the keywords instead of the engineering. The useful part is not the vocabulary; it is explaining sampling, modulation, protection, startup, and test evidence clearly. This page publishes the non-sensitive legacy files first and admits that the line is still an archive, not a mature FOC case study.
这条线最大的风险是“看起来高级,所以很容易写虚”。真正有用的不是关键词,而是把采样、调制、保护、起转和测试记录讲清楚。当前页面先把非敏感 legacy 文件放出来,同时承认它还只是材料页,不把文件数量当成项目成熟度。
Development Notes开发笔记
Project notes connected to hardware, firmware, documentation, and archive material.和这个项目相关的硬件、固件、文档和归档笔记。
Public Project Files公开项目资料
Uploaded evidence served from the public asset folder. Use the file index to preview documents, source code, media, PDFs, and downloadable artifacts without leaving the page.这里列出已经上传到公开目录的项目证据。可以在左侧索引里选择文件,在右侧直接预览文档、源码、媒体、PDF 和可下载附件。
board-config.c
C / 18.6 KB
/**********************************
**********************************/
#include "main.h"
#include "board_config.h"
void hard_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef PWM_TIM_TimeBaseStructure;
TIM_OCInitTypeDef PWM_TIM_OCInitStructure;
TIM_BDTRInitTypeDef PWM_TIM_BDTRInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
TIM_TimeBaseInitTypeDef TIM_HALLTimeBaseInitStructure;
TIM_ICInitTypeDef TIM_HALLICInitStructure;
//TIM_TimeBaseInitTypeDef COM_TASK_TIM_TimeBaseStructure;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
RCC_AHB1PeriphClockCmd(OLED_SPIx_SCK_GPIO_CLK | OLED_SPIx_MOSI_GPIO_CLK|OLED_DC_GPIO_CLK|OLED_RESET_GPIO_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(DRV8301_SPIx_SCK_GPIO_CLK|DRV8301_SPIx_MOSI_GPIO_CLK|DRV8301_SPIx_MISO_GPIO_CLK|DRV8301_SPIx_CS_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(KEY_1_GPIO_CLK|KEY_2_GPIO_CLK|KEY_3_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(PWM_AH_GPIO_CLK|PWM_BH_GPIO_CLK|PWM_CH_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(PWM_AL_GPIO_CLK|PWM_BL_GPIO_CLK|PWM_CL_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(HALL_CH1_GPIO_CLK|HALL_CH2_GPIO_CLK|HALL_CH3_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(DRV8301_ENGATE_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(DRV8301_FAULT_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(VBUS_ADC_GPIO_CLK|A_CURRENT_ADC_GPIO_CLK|B_CURRENT_ADC_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(TOTAL_CURRENT_ADC_GPIO_CLK|TEMPERATURE_ADC_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(U_VOLT_ADC_GPIO_CLK|V_VOLT_ADC_GPIO_CLK|W_VOLT_ADC_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(USER_LED_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(PWM_TIM_CLK, ENABLE);
RCC_APB2PeriphClockCmd(SAMPLE_ADC_CLK,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB1PeriphClockCmd(HALL_TIM_CLK, ENABLE);
RCC_APB1PeriphClockCmd(COMMUNICATION_TASK_TIM_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(DMA2_CLK, ENABLE);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
//hall sensor config start
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = HALL_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(HALL_CH1_GPIO_PORT, &GPIO_InitStructure);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = HALL_CH2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(HALL_CH2_GPIO_PORT, &GPIO_InitStructure);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = HALL_CH3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(HALL_CH3_GPIO_PORT, &GPIO_InitStructure);
GPIO_PinAFConfig(HALL_CH1_GPIO_PORT,HALL_CH1_SOURCE,HALL_CH1_AF);
GPIO_PinAFConfig(HALL_CH2_GPIO_PORT,HALL_CH2_SOURCE,HALL_CH2_AF);
GPIO_PinAFConfig(HALL_CH3_GPIO_PORT,HALL_CH3_SOURCE,HALL_CH3_AF);
TIM_DeInit(HALL_TIM);
TIM_TimeBaseStructInit(&TIM_HALLTimeBaseInitStructure);
TIM_HALLTimeBaseInitStructure.TIM_Period = 0xffffffff;
TIM_HALLTimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(HALL_TIM,&TIM_HALLTimeBaseInitStructure);
TIM_ICStructInit(&TIM_HALLICInitStructure);
TIM_HALLICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_HALLICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_HALLICInitStructure.TIM_ICFilter = 0x0f;
TIM_ICInit(HALL_TIM,&TIM_HALLICInitStructure);
TIM_PrescalerConfig(HALL_TIM, (u16)0,TIM_PSCReloadMode_Immediate);
TIM_InternalClockConfig(HALL_TIM);
TIM_SelectHallSensor(HALL_TIM, ENABLE);
TIM_SelectInputTrigger(HALL_TIM, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(HALL_TIM,TIM_SlaveMode_Reset);
TIM_ClearFlag(HALL_TIM, TIM_FLAG_Update|
TIM_FLAG_CC1|
TIM_FLAG_CC2|
TIM_FLAG_CC3|
TIM_FLAG_CC4|
TIM_FLAG_Trigger|
TIM_FLAG_CC1OF|
TIM_FLAG_CC2OF|
TIM_FLAG_CC3OF|
TIM_FLAG_CC4OF);
TIM_ITConfig(HALL_TIM, TIM_IT_CC1, ENABLE);
TIM_SetCounter(HALL_TIM, 0);
TIM_Cmd(HALL_TIM, ENABLE);
//hall sensor config end
//communication task timer config start
//TIM_DeInit(COMMUNICATION_TASK_TIM);
//TIM_TimeBaseStructInit(&COM_TASK_TIM_TimeBaseStructure);
//COM_TASK_TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//COM_TASK_TIM_TimeBaseStructure.TIM_Prescaler = COMMUNICATION_TASK_TIM_PRESCALER;
//COM_TASK_TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//COM_TASK_TIM_TimeBaseStructure.TIM_Period = COM_TASK_TIM_PERIOD;
//TIM_TimeBaseInit(COMMUNICATION_TASK_TIM,&COM_TASK_TIM_TimeBaseStructure);
//TIM_ITConfig(COMMUNICATION_TASK_TIM, TIM_IT_Update, ENABLE);
//TIM_Cmd(COMMUNICATION_TASK_TIM, ENABLE);
//communication task timer config end
//DRV8301 引脚 config start
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = DRV8301_FAULT_PIN;
GPIO_Init(DRV8301_FAULT_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = DRV8301_ENGATE_PIN;
GPIO_Init(DRV8301_ENGATE_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Pin = DRV8301_SPIx_SCK_PIN;
GPIO_Init(DRV8301_SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DRV8301_SPIx_MOSI_PIN;
GPIO_Init(DRV8301_SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = DRV8301_SPIx_CS_PIN;
GPIO_Init(DRV8301_SPIx_CS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Pin = DRV8301_SPIx_MISO_PIN;
GPIO_Init(DRV8301_SPIx_MISO_GPIO_PORT, &GPIO_InitStructure);
//DRV8301 SPI 引脚 初始电平
GPIO_SetBits(DRV8301_ENGATE_GPIO_PORT,DRV8301_ENGATE_PIN);
GPIO_SetBits(DRV8301_SPIx_CS_GPIO_PORT,DRV8301_SPIx_CS_PIN);
GPIO_SetBits(DRV8301_SPIx_MISO_GPIO_PORT,DRV8301_SPIx_MISO_PIN);
GPIO_ResetBits(DRV8301_SPIx_SCK_GPIO_PORT,DRV8301_SPIx_SCK_PIN);
GPIO_ResetBits(DRV8301_SPIx_MOSI_GPIO_PORT,DRV8301_SPIx_MOSI_PIN);
//DRV8301 引脚 config end
//OLED显示屏 引脚 config start
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = OLED_SPIx_SCK_PIN;
GPIO_Init(OLED_SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = OLED_SPIx_MOSI_PIN;
GPIO_Init(OLED_SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = OLED_DC_PIN;
GPIO_Init(OLED_DC_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = OLED_RESET_PIN;
GPIO_Init(OLED_RESET_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(OLED_RESET_GPIO_PORT,OLED_RESET_PIN);
//OLED显示屏 引脚 config end
//LED提示灯 引脚 config start
GPIO_InitStructure.GPIO_Pin = USER_LED_PIN;
GPIO_Init(USER_LED_GPIO_PORT, &GPIO_InitStructure);
//LED提示灯 引脚 config end
//PWM config start
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = PWM_AH_PIN;
GPIO_Init(PWM_AH_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PWM_AL_PIN;
GPIO_Init(PWM_AL_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PWM_BH_PIN;
GPIO_Init(PWM_BH_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PWM_BL_PIN;
GPIO_Init(PWM_BL_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PWM_CH_PIN;
GPIO_Init(PWM_CH_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PWM_CL_PIN;
GPIO_Init(PWM_CL_GPIO_PORT, &GPIO_InitStructure);
GPIO_PinAFConfig(PWM_AH_GPIO_PORT,PWM_AH_SOURCE,PWM_AH_AF);
GPIO_PinAFConfig(PWM_AL_GPIO_PORT,PWM_AL_SOURCE,PWM_AL_AF);
GPIO_PinAFConfig(PWM_BH_GPIO_PORT,PWM_BH_SOURCE,PWM_BH_AF);
GPIO_PinAFConfig(PWM_BL_GPIO_PORT,PWM_BL_SOURCE,PWM_BL_AF);
GPIO_PinAFConfig(PWM_CH_GPIO_PORT,PWM_CH_SOURCE,PWM_CH_AF);
GPIO_PinAFConfig(PWM_CL_GPIO_PORT,PWM_CL_SOURCE,PWM_CL_AF);
TIM_DeInit(PWM_TIM);
TIM_TimeBaseStructInit(&PWM_TIM_TimeBaseStructure);
PWM_TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
PWM_TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
PWM_TIM_TimeBaseStructure.TIM_Period = PWM_TIM_PULSE;
PWM_TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
PWM_TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(PWM_TIM, &PWM_TIM_TimeBaseStructure);
TIM_OCStructInit(&PWM_TIM_OCInitStructure);
PWM_TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
PWM_TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
PWM_TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
PWM_TIM_OCInitStructure.TIM_Pulse = PWM_TIM_PULSE>>1;
PWM_TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
PWM_TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
PWM_TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
PWM_TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init(PWM_TIM, &PWM_TIM_OCInitStructure);
TIM_OC2Init(PWM_TIM, &PWM_TIM_OCInitStructure);
TIM_OC3Init(PWM_TIM, &PWM_TIM_OCInitStructure);
PWM_TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
PWM_TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
PWM_TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
PWM_TIM_OCInitStructure.TIM_Pulse = PWM_TIM_PULSE;
PWM_TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
PWM_TIM_OCInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
PWM_TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
PWM_TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC4Init(PWM_TIM, &PWM_TIM_OCInitStructure);
PWM_TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
PWM_TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
PWM_TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
PWM_TIM_BDTRInitStructure.TIM_DeadTime = PWM_DEAD_TIME;
PWM_TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
PWM_TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
PWM_TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
TIM_BDTRConfig(PWM_TIM, &PWM_TIM_BDTRInitStructure);
//TIM_ITConfig(PWM_TIM, TIM_IT_Update, ENABLE);
TIM_Cmd(PWM_TIM, ENABLE);
PWM_TIM->CCR1 = PWM_TIM_PULSE>>1;
PWM_TIM->CCR2 = PWM_TIM_PULSE>>1;
PWM_TIM->CCR3 = PWM_TIM_PULSE>>1;
PWM_TIM->CCR4 = PWM_TIM_PULSE-1;
//PWM config end
//DMA config start
DMA_InitStructure.DMA_Channel = DMA_CHANNEL0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_STREAM0, &DMA_InitStructure);
DMA_Cmd(DMA2_STREAM0, ENABLE);
//DMA config end
//ADC config start
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = VBUS_ADC_PIN;
GPIO_Init(VBUS_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = A_CURRENT_ADC_PIN;
GPIO_Init(A_CURRENT_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = B_CURRENT_ADC_PIN;
GPIO_Init(B_CURRENT_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TOTAL_CURRENT_ADC_PIN;
GPIO_Init(TOTAL_CURRENT_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TEMPERATURE_ADC_PIN;
GPIO_Init(TEMPERATURE_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = U_VOLT_ADC_PIN;
GPIO_Init(U_VOLT_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = V_VOLT_ADC_PIN;
GPIO_Init(V_VOLT_ADC_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = W_VOLT_ADC_PIN;
GPIO_Init(W_VOLT_ADC_GPIO_PORT,&GPIO_InitStructure);
ADC_DeInit();
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_ExternalTrigConvEdge =ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;;
ADC_InitStructure.ADC_NbrOfConversion = 4;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_Init(SAMPLE_ADC, &ADC_InitStructure);
ADC_InjectedSequencerLengthConfig(SAMPLE_ADC,4);
ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC,ADC_ExternalTrigInjecConv_T1_CC4);
ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC,ADC_ExternalTrigInjecConvEdge_Rising);
ADC_InjectedChannelConfig(SAMPLE_ADC,VBUS_ADC_CHANNEL,1,ADC_SampleTime_15Cycles);
ADC_InjectedChannelConfig(SAMPLE_ADC,A_CURRENT_ADC_CHANNEL,2,ADC_SampleTime_15Cycles);
ADC_InjectedChannelConfig(SAMPLE_ADC,B_CURRENT_ADC_CHANNEL,3,ADC_SampleTime_15Cycles);
ADC_InjectedChannelConfig(SAMPLE_ADC,TOTAL_CURRENT_ADC_CHANNEL,4,ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(SAMPLE_ADC, U_VOLT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(SAMPLE_ADC, V_VOLT_ADC_CHANNEL, 2, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(SAMPLE_ADC, W_VOLT_ADC_CHANNEL, 3, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(SAMPLE_ADC, TEMPERATURE_ADC_CHANNEL, 4, ADC_SampleTime_15Cycles);
ADC_DMARequestAfterLastTransferCmd(SAMPLE_ADC, ENABLE);
ADC_DMACmd(SAMPLE_ADC, ENABLE);
ADC_ITConfig(SAMPLE_ADC, ADC_IT_JEOC, ENABLE);
ADC_ClearFlag(SAMPLE_ADC, ADC_FLAG_JEOC);
ADC_Cmd(SAMPLE_ADC,ENABLE);
ADC_SoftwareStartConv(SAMPLE_ADC);
//ADC config end
//按键 config start
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = KEY_1_PIN;
GPIO_Init(KEY_1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY_2_PIN;
GPIO_Init(KEY_2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY_3_PIN;
GPIO_Init(KEY_3_GPIO_PORT, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(KEY_1_EXTI_GPIO_PORT, KEY_1_EXTI_SOURCE);
SYSCFG_EXTILineConfig(KEY_2_EXTI_GPIO_PORT, KEY_2_EXTI_SOURCE);
SYSCFG_EXTILineConfig(KEY_3_EXTI_GPIO_PORT, KEY_3_EXTI_SOURCE);
EXTI_InitStructure.EXTI_Line = KEY_1_EXTI_LINE|KEY_2_EXTI_LINE|KEY_3_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//按键 config end
//USB通讯配置 start
//communication_init();
//USB通讯配置 end
//中断优先级设置 start
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/*
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*
NVIC_InitStructure.NVIC_IRQChannel = COM_TASK_TIM_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#ifdef __ICCARM__
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
//中断优先级设置 end
}
Related Media相关媒体
Images, videos, board renders, and public evidence connected to this project.和这个项目相关的图片、视频、板卡渲染图和公开证据。

FOC driver board render慧驱动 FOC 测试板渲染图
3D render for the sensorless PMSM FOC driver board archive.无感 PMSM FOC 驱动板归档页使用的 3D 板卡渲染图。

FOC MCU schematic sheetFOC MCU 分页原理图
MCU sheet from the FOC driver board schematic export.FOC 驱动板原理图导出的 MCU 分页。

FOC connector schematic sheetFOC 连接器分页原理图
Connector sheet from the FOC driver board schematic export.FOC 驱动板原理图导出的连接器分页。

FOC ADC schematic sheetFOC ADC 分页原理图
ADC sheet from the FOC driver board schematic export.FOC 驱动板原理图导出的 ADC 采样分页。

FOC MOSFET stage schematic sheetFOC MOS 功率级分页原理图
MOSFET power-stage sheet from the FOC driver board schematic export.FOC 驱动板原理图导出的 MOS 功率级分页。

FOC driver schematic sheetFOC 驱动分页原理图
Driver sheet from the FOC driver board schematic export.FOC 驱动板原理图导出的驱动分页。