前言
在上一讲我们讲了无感无刷电机控制的算法,其中我们通过按键的方式来控制启停和速度控制。在这一讲我们将为大家讲解如何使用电位器来控制无感无刷电机转速的变化。
在这一讲中我们主要涉及以下几个功能,按键控制电机启停,电位器控制无刷电机速度变化,硬件环境我们使用的是KY_Motor的无刷电机开发板,基于stm32f103,支持单电阻,三电阻电流采样。
链接:开发板链接
这一讲主要涉及接口应用程序的编写,因此较为简单。
原理图中我们可以看到电位器的引脚为PC1,因此我们需要对PC1进行一个ADC的基本配置。
这一讲跟大家熟知的ADC部分配置完全相同,因此也是采集电位器的AD值,我们直接贴代码。
ADC部分初始化:
void ADC_INIT(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//PC1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
ADC值的获取:
u16 Get_Adc(u8 ch) //ADC值
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束
return ADC_GetConversionValue(ADC1);
}
ADC 值获取平均值:
u16 Get_Adc_Average(u8 ch,u8 count)
{
static u16 temp_val[10]={0};
u8 t;
u32 valueall;
for(t=count-1;t>=1;t--)
{
temp_val[t]=temp_val[t-1];
valueall+=temp_val[t];
}
temp_val[0] = Get_Adc(ch);
valueall+=temp_val[0];
return valueall/count;
}
以上是adc部分的配置,将ADC部分的值赋值到新的变量aim_speed中,
aim_speed = Get_Adc_Average(ADC_Channel_11,10) - 1800; //得到电位器值进行运算
ADC值设置阀值,adc的值的范围是0-4095,因此需要设置一个adc值的区间,才能保证采集到的adc值一定的区间内,电机也能在电位器的控制范围内运行。
if(aim_speed<200)
{
aim_speed=200; //最小值
}
//aim_speed 值的范围0-4095,为12为ADC的值
if(aim_speed>4059 )
{
aim_speed=4059; //最大值
}
我们将aim_speed的值赋给pwm就可以实现电位器速度控制了。
这个是测试的视频,通过转动电位器,速度会变化,做这个实验的时候要注意电位器归零,在按动启动按键的时候如果电位器不归零,会突然加速,注意安全。
stm32无刷电机驱动_电位器调速
电位器控制如同电动车档把的速度控制模型,下一讲我们将为大家分享电动车驱动器的设计方法。