基于stm32单片机的电位计控制舵机旋转角度实验

本实验要用到一个ADC输入管脚和一个PWM输出管脚,通过ADC输入管脚来接收电位器的信号,用PWM输出管脚来控制舵机的左右转,同时为了方便显示信号信息,使用LCD显示频来显示显示量值,范围是0-4096。如果数值减小,说明电位器向左转了,那么让舵机向左转;反之亦然。

下边给出这个程序的主函数部分,有注释,以供读者借鉴。

 int main(void)
 {  
  u16 adcx;
u16 xiang1=0,xiang2=0;
float temp;
delay_init();                       //延时函数初始化  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
  LED_Init();     //LED端口初始化
LCD_Init();
  Adc_Init();   //ADC初始化
 
TIM3_PWM_Init(199,7199); //不分频PWM频率=(7200*200)/72000000=0.02=20ms


POINT_COLOR=RED;      //设置字体为红色 
LCD_ShowString(60,50,200,16,16,"Elite STM32");
LCD_ShowString(60,70,200,16,16,"ADC TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2015/1/14");
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");      
LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");       
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,10);
LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值


xiang1=adcx;
if(xiang2 - xiang1 >300)            //由于电位器电压不稳定,所以用这个差值来减小误差
{
TIM_SetCompare2(TIM3,180); //左转
      delay_ms(100);
   TIM_SetCompare2(TIM3,185); //stop
   delay_ms(100);
}
else
if(xiang1 - xiang2>300)
{
TIM_SetCompare2(TIM3,190); //右转
      delay_ms(100);
   TIM_SetCompare2(TIM3,185); //stop
   delay_ms(100);
}
else
{
   TIM_SetCompare2(TIM3,185); //stop
   delay_ms(100);
}
xiang2=xiang1;


temp=(float)adcx*(3.3/4096);
adcx=temp;
LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
temp-=adcx;
temp*=1000;
LCD_ShowxNum(172,150,temp,3,16,0X80);
LED0=!LED0;
delay_ms(250);
}
 }

猜你喜欢

转载自blog.csdn.net/cheetah2/article/details/80480465