本文主要是介绍基于mini stm32 PS2遥控控制舵机,LCD屏显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
引言
这是为了研究微型四旋翼无人机做的一个小测试,测试摇杆和舵机的性能,为后续控制空心杯电机做准备
实验器材
miniSTM32板,servo 9g 舵机,PS2摇杆,LCD显示屏
实物接线
ps2 stm32 舵机 stm32
GND GND 橙色信号线 PA8
+5V 3.3V 舵机需要4.6V-6V之间电源供电,需要额外供电
VRX PA0
VRY PA1
SW PA3
舵机
舵机需要一个频率为50hz的pwm波来控制,占空比与角度关系如下图所示
程序
主函数部分:
int main(void){ u16 pwmval;u16 adcx,adcy,adcz;int i;float temp,temp1,temp2;delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600LED_Init(); // LED和PWM初始化的先后顺序非常重要TIM1_PWM_Init(7199,199);LCD_Init(); Adc_Init(); adcx=Get_Adc_Average(ADC_Channel_1,10);adcy=Get_Adc_Average(ADC_Channel_2,10);adcz=Get_Adc_Average(ADC_Channel_3,10);pwmval=(int)adcx*(7200/4096);//这里的参数不能修改,不然输出数值不变pwmval=pwmval/6; //可以在这里修改,根据舵机的占空比来定数值pwmval+=6300;if(pwmval>=6300&&pwmval<7020){TIM_SetCompare1(TIM1,pwmval); } elsefor(i=7020;i>6300;i--){TIM_SetCompare1(TIM1,i);LED1=!LED1;delay_ms(10);}
LCD显示部分代码
LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值LCD_ShowxNum(156,170,adcy,4,16,0);LCD_ShowxNum(156,210,adcz,4,16,0);temp=(float)adcx*(3.3/4096);adcx=temp;temp1=(float)adcy*(3.3/4096);adcy=temp1;temp2=(float)adcz*(3.3/4096);adcz=temp2;LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值整数部分LCD_ShowxNum(156,190,adcy,1,16,0);LCD_ShowxNum(156,230,adcz,1,16,0);temp-=adcx;temp1-=adcy;temp2-=adcz;temp*=1000;temp1*=1000;temp2*=1000;LCD_ShowxNum(172,150,temp,3,16,0X80);//读取的电压值小数部分LCD_ShowxNum(172,190,temp1,3,16,0X80);LCD_ShowxNum(172,230,temp2,3,16,0X80);
adc部分代码
//PA1 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure); //PA2 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure); //PA3 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);
u16 Get_Adc(u8 ch)
{//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 ADC_RegularChannelConfig(ADC1, ch, 2, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ch, 3, ADC_SampleTime_239Cycles5 );ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}u16 Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;
}
实物效果
总结:
工程文件基于stm32官方提供的ADC文件,在此基础上添加了pwm.c等文件,注意除了在hardware中添加pwm.c,还要在FWlib中添加stm32f10x.time.c文件,不然编译会报错!!!
此外,还要注意GPIO口可能有多个功能,作为PWM通道或者LED0的输出端口,这些看似不相干的模式,其实互相联系,当要输出pwm波时,就必须先初始化GPIO,否则就输出不了pwm!
ps2摇杆控制舵机,基于stm32mini板
这篇关于基于mini stm32 PS2遥控控制舵机,LCD屏显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!