用按鍵設置定時器重裝值及分頻值,脈沖數。經過開發板測試。圖片無法上傳
//步進電機
//用定時器中斷(S曲線7段法)。LCD12864串口模式顯示,用按鍵設置定時器(TIM5_Int_Init(999,999);)的兩個傳入參數來
//改變中斷次數與分頻系數達到單位時間內的脈沖值。
//脈沖可設置
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "motor.h"
#include "s_curve.h"
#include "key.h"
#include "12864.h"
//////////////////////////////////////////////
u8 key_num=0;
u8 Table0[3]={0x00};
u8 Table1[3]={0x00};
u8 Table2[3]={0x00};
u16 arr,psc,pulse;
////////////////////////////////////////////////
void display()
{
lcd_pos(1,3); //自動重裝值
write_char(':');
Table0[0]=(arr%1000/100+0x30);
Table0[1]=(arr%100/10+0x30);
Table0[2]=(arr%10+0x30);
write_char(Table0[0]);
write_char(Table0[1]);
write_char(Table0[2]);
lcd_pos(2,4); //時鐘預分頻數
write_char(':');
Table1[0]=(psc%1000/100+0x30);
Table1[1]=(psc%100/10+0x30);
Table1[2]=(psc%10+0x30);
write_char(Table1[0]);
write_char(Table1[1]);
write_char(Table1[2]);
lcd_pos(3,3); //脈沖數
write_char(':');
Table2[0]=(pulse%1000/100+0x30);
Table2[1]=(pulse%100/10+0x30);
Table2[2]=(pulse%10+0x30);
write_char(Table2[0]);
write_char(Table2[1]);
write_char(Table2[2]);
}
////////////////////////////////////////////////////////////////
int main(void)
{
u8 key;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
lcd_gpio_Init();
Motor_Init();
TIM5_Int_Init(999,999);//
KEY_Init();
lcd_init();//12864初始化
delay_ms(20);
lcd_clear();//清屏
delay_ms(10);
lcd_wstr(1,0,"重裝值 ");
lcd_wstr(2,0,"分頻系數 ");
lcd_wstr(3,0,"脈沖數 ");
display();
delay_ms(2000);
s_curve_start_Motor(1,40);//1代表順時針,400旋轉脈沖
delay_ms(3000);
s_curve_start_Motor(0,40);//0代表逆時針,400旋轉脈沖
delay_ms(3000);
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
delay_ms(50);
key_num++;
switch(key_num)
{
case 1:
send_cmd(0x0c); //關光標關閃爍
lcd_pos(1,3); //
write_char(':');
Table0[0]=(arr%1000/100+0x30);
Table0[1]=(arr%100/10+0x30);
Table0[2]=(arr%10+0x30);
write_char(Table0[0]);
write_char(Table0[1]);
write_char(Table0[2]);
send_cmd(0x80|0x04);
send_cmd(0x0f); //開光標并閃爍
break;
case 2:
send_cmd(0x0c); //關光標關閃爍
lcd_pos(2,4); //
write_char(':');
Table1[0]=(psc%1000/100+0x30);
Table1[1]=(psc%100/10+0x30);
Table1[2]=(psc%10+0x30);
write_char(Table1[0]);
write_char(Table1[1]);
write_char(Table1[2]);
send_cmd(0x90|0x05);
send_cmd(0x0f); //開光標并閃爍
break;
case 3:
send_cmd(0x0c); //關光標關閃爍
lcd_pos(3,3); //
write_char(':');
Table2[0]=(pulse%1000/100+0x30);
Table2[1]=(pulse%100/10+0x30);
Table2[2]=(pulse%10+0x30);
write_char(Table2[0]);
write_char(Table2[1]);
write_char(Table2[2]);
send_cmd(0x88|0x04);
send_cmd(0x0f); //開光標并閃爍
break;
case 4:
send_cmd(0x0c); //關光標關閃爍
key_num=0;
TIM5_Int_Init(arr,psc);//
break;
}
}
if(key_num!=0)
{
if(key==KEY1_PRES)
{
delay_ms(50);
switch(key_num)
{
case 1:arr+=10;if(arr==1000)arr=0;
send_cmd(0x0c); //關光標關閃爍
lcd_pos(1,3); //
write_char(':');
Table0[0]=(arr%1000/100+0x30);
Table0[1]=(arr%100/10+0x30);
Table0[2]=(arr%10+0x30);
write_char(Table0[0]);
write_char(Table0[1]);
write_char(Table0[2]);
send_cmd(0x80|0x04);
send_cmd(0x0f); //開光標并閃爍
break;
case 2:psc+=10;if(pulse==1000)pulse=0;
send_cmd(0x0c); //關光標關閃爍
lcd_pos(2,4); //
write_char(':');
Table1[0]=(psc%1000/100+0x30);
Table1[1]=(psc%100/10+0x30);
Table1[2]=(psc%10+0x30);
write_char(Table1[0]);
write_char(Table1[1]);
write_char(Table1[2]);
send_cmd(0x90|0x05);
send_cmd(0x0f); //開光標并閃爍
break;
case 3:pulse+=10;if(pulse==1000)pulse=0;
send_cmd(0x0c); //關光標關閃爍
lcd_pos(3,3); //
write_char(':');
Table2[0]=(pulse%1000/100+0x30);
Table2[1]=(pulse%100/10+0x30);
Table2[2]=(pulse%10+0x30);
write_char(Table2[0]);
write_char(Table2[1]);
write_char(Table2[2]);
send_cmd(0x88|0x04);
send_cmd(0x0f); //開光標并閃爍
break;
}
}
}
if(key_num==0)
{
// if(key==KEY0_PRES)
// {
// s_curve_start_Motor(1,400);//順時針旋轉1圈
// delay_ms(500);
// }
if(key==KEY1_PRES)
{
s_curve_start_Motor(0,pulse);//順時針旋轉1圈
delay_ms(500);
}
}
}
}
全部程序51hei下載地址:
stm32_步進電機.7z
(193.99 KB, 下載次數: 57)
2019-10-8 16:58 上傳
點擊文件名下載附件
|