最近公司刚好想研发一款能够进行图传的四轴,stm32F4系列的mcu强大的控制算法运行能力,丰富的外设功能和易用性吸引了我。刚好碰到st mcu推广活动。特此申请能得到这个试用机会,希望您能给我这个机会。以下是我做的基于stm32f103的无刷电机kv值测试器。 我这个Kv转速表主要是应用在检测测无刷电机kv 值的。它主要原理是:无刷电机工作过程通过检测电机反电动势会有个梯形波。计算单位时间内梯形波的数量得到在某个电压工作下的转速值。Kv值就=转速值/电压值。 那么简单说明下这个功能实现的原理是通过在电调的ABC三相中两相加个led灯和一个限流电阻。每当有一个梯形波产生时会驱动led灯。图中led是一个光感电阻。将光感电阻和led灯使用热缩套管密封在一起(公司光耦合器用完了)。这样每次有一个梯形波产生,lm358会将信号放大经过speed给mcu检测脚一个高电平信号。 系统的电压、电流使用adc功能检测,电流使用个精密电阻通过放大电路转换给adc检测脚。 以下是ADC配置代码 void ADC1_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_DeInit(ADC1); RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode =ENABLE; //模数转换工作在扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发转换关闭 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 2; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_DMACmd(ADC1, ENABLE); // 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数) ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //复位指定的ADC1的校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1复位校准寄存器的状态,设置状态则等待 ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态 } void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设ADC基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //内存作为数据传输的目的地 DMA_InitStructure.DMA_BufferSize = 50*2; //DMA通道的DMA缓存的大小 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; //数据宽度为16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道 } /*求平均值函数*/ void filter(void) { int sum = 0; u8 count; <span lang="EN-US">for(i=0;i |
RE:【MCU实战经验】+基于stm32f103的无刷电机kv值测试器
不错,值得学习