搜索
查看: 6705|回复: 2

【MCU实战经验】+基于stm32f103的无刷电机kv值测试器

[复制链接]

该用户从未签到

2

主题

12

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-1
发表于 2014-4-18 21:42:41 | 显示全部楼层 |阅读模式
      最近公司刚好想研发一款能够进行图传的四轴,stm32F4系列的mcu强大的控制算法运行能力,丰富的外设功能和易用性吸引了我。刚好碰到st mcu推广活动。特此申请能得到这个试用机会,希望您能给我这个机会。以下是我做的基于stm32f103的无刷电机kv值测试器。
     我这个Kv转速表主要是应用在检测测无刷电机kv 值的。它主要原理是:无刷电机工作过程通过检测电机反电动势会有个梯形波。计算单位时间内梯形波的数量得到在某个电压工作下的转速值。Kv值就=转速值/电压值。
那么简单说明下这个功能实现的原理是通过在电调的ABC三相中两相加个led灯和一个限流电阻。每当有一个梯形波产生时会驱动led灯。图中led是一个光感电阻。将光感电阻和led灯使用热缩套管密封在一起(公司光耦合器用完了)。这样每次有一个梯形波产生,lm358会将信号放大经过speedmcu检测脚一个高电平信号。
QQ图片20131128111507.jpg
 
系统的电压、电流使用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); // 开启ADCDMA支持(要实现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
WP_20140417_003.jpg
回复

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-5-21 00:26:49 | 显示全部楼层

RE:【MCU实战经验】+基于stm32f103的无刷电机kv值测试器

好!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

50

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-8
发表于 2019-7-26 15:17:34 | 显示全部楼层
good
不错,值得学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-27 05:38 , Processed in 0.151014 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表