#include "iostm8s105K4.h"//主控芯片的头文件
#define A PD_ODR_ODR1 //A+
#define B PD_ODR_ODR2 //A-
#define C PD_ODR_ODR3 //B+
#define D PD_ODR_ODR4 //B-
#define KEYA PC_IDR_IDR5//连接至KEY引脚
#define KEYB PC_IDR_IDR6//连接至KEY引脚
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
u8 forward[8]={0x02,0x0A,0x08,0x0C,0x04,0x14,0x10,0x12};//正转
u8 reverse[8]={0x12,0x10,0x14,0x04,0x0C,0x08,0x0A,0x02};//反转
u16 num=0;
u8 speed;
uint8_t startflag = 0;//
uint16_t timercnt = 0;//
static u16 AD_Vtemp[10]={0};//装载10次ADC采样数据
static u16 AD_val=0;//ADC单次采样数据
static u16 GETvoltage=0;//获取到的电压
void ADC_init(void); //ADC2初始化函数声明
void ADC_GET(void); //ADC2模数转换函数声明
void AVG_AD_Vtemp(void); //平均值滤波函数声明
void init_timer4(void);//
void delayus(uint16_t us);//
void delayms(uint16_t ms);//
void SetMotor(unsigned char InputData);
void Step_Motor_GPIO_Init(void);
void MotoCtrl(u8 speed ,u8 direction,u8 step);
void CLK_init(void);
void init_devices(void);
//void delay(u16 Count);//延时函数声明
void CLK_init(void)
{
// CLK_CKDIVR=0;//选定HSI时钟源配置频率为16MHz
CLK_CKDIVR = 0x08; // 16M内部RC经8分频后系统时钟为2M
}
void init_timer4(void)
{
TIM4_PSCR = 0x03;//分频值,2M/2^3=250K
TIM4_ARR = 255;//0xF9; //设置自动重装载值255
TIM4_IER = 0x01;//开启TIM4更新事件中断使能
TIM4_CNTR = 255;//计数器初值,255*(1/250)=0.00102S=1ms//配置TIM4定时器初值,使得开始计数时发生第一次溢出
//产生更新事件和更新事件中断
}
void delayms(uint16_t ms)
{
uint16_t i=0;
// uint16_t j=0;
for(i=0;i<ms;i++)
{
delayus(100);
}
}
void delayus(uint16_t us)
{
//Set the flag to make ISR start to count
startflag = 1;
us = (us <= 25?25:us);
us = us / 25 - 1;
// TIM4_Cmd(ENABLE);
//Wait until expire
while(timercnt <= us);
//TIM4_Cmd(DISABLE);
//Clear flag and timer cnt
startflag = 0;
timercnt = 0;
}
void Step_Motor_GPIO_Init(void)
{
PD_DDR_DDR1=1; //配置PI0端口为输出模式
PD_CR1_C11=1; //配置PI0端口为推挽输出模式
PD_CR2_C21=0; //配置PI0端口低斜率输出
PD_DDR_DDR2=1; //配置PI0端口为输出模式
PD_CR1_C12=1; //配置PI0端口为推挽输出模式
PD_CR2_C22=0; //配置PI0端口低斜率输出
PD_DDR_DDR3=1; //配置PI0端口为输出模式
PD_CR1_C13=1; //配置PI0端口为推挽输出模式
PD_CR2_C23=0; //配置PI0端口低斜率输出
PD_DDR_DDR4=1; //配置PI0端口为输出模式
PD_CR1_C14=1; //配置PI0端口为推挽输出模式
PD_CR2_C24=0; //配置PI0端口低斜率输出
PC_DDR_DDR4=1; //配置PI0端口为输出模式
PC_CR1_C14=1; //配置PI0端口为推挽输出模式
PC_CR2_C24=0; //配置PI0端口低斜率输出
PC_DDR_DDR5=0; //配置PB0端口为输入模式
PC_CR1_C15=1; //配置PB0端口为弱上拉输入模式
PC_CR2_C25=1; //使能PB0端口外部中断
PC_DDR_DDR6=0; //配置PB0端口为输入模式
PC_CR1_C16=1; //配置PB0端口为弱上拉输入模式
PC_CR2_C26=1; //使能PB0端口外部中断
}
//引脚映射
void SetMotor(unsigned char InputData)
{
if(InputData == 0x02)// 1
{
A = 1;
B = 0;
C = 0;
D = 0;
// delay(x);
}
else if(InputData == 0x0A)//2
{
A = 1;
B = 0;
C = 1;
D = 0;
// delay(x);
}
else if(InputData == 0x08)//3
{
A = 0;
B = 0;
C = 1;
D = 0;
// delay(x);
}
else if(InputData == 0x0C)//4
{
A = 0;
B = 1;
C = 1;
D = 0;
// delay(x);
}
else if(InputData == 0x04)//5
{
A = 0;
B = 1;
C = 0;
D = 0;
// delay(x);
}
else if(InputData == 0x14)//6
{
A = 0;
B = 1;
C = 0;
D = 1;
// delay(x);
}
else if(InputData == 0x10)//7
{
A = 0;
B = 0;
C = 0;
D = 1;
// delay(x);
}
else if(InputData == 0x12)//8
{
A = 1;
B = 0;
C = 0;
D = 1;
// delay(x);
}
else if(InputData == 0x00)
{
A = 0;
B = 0;
C = 0;
D = 0;
}
}
void MotoCtrl(u8 speed ,u8 direction,u8 step)
{
if(1 == direction)
{
SetMotor(0x00);
SetMotor(forward[step]);
//delay(speed); //修改延时 可控制转速
delayms(speed);
}
if (0 == direction)
{
SetMotor(0x00);
SetMotor(reverse[step]);
//delay(speed);
delayms(speed);
}
}
void init_devices(void)//装置
{
asm("sim"); // 关全局中断
Step_Motor_GPIO_Init();
CLK_init();
ADC_init();//初始化ADC2
EXTI_CR1|=0x04;//配置PB为仅上升沿触发
init_timer4();
asm("rim");//改变主程序软件优先级“开启中断”
TIM4_CR1 |= 0x01;//使能计数器功能,TIM4_CR1寄存器CEN位为“1”
}
/*
void delay(u16 Count)
{
u8 i,j;
while (Count--)//Count形参控制延时次数
{
for(i=0;i<50;i++)
for(j=0;j<20;j++);
}
}
*/
///////////////////////////////////////////////////////////////////////////////
u16 uMotoStep=0;
u16 uMotoSpeed=0;
u16 uDir=0;
void main()
{
init_devices();
PD_ODR = 0x00;
while(1)
{
ADC_GET();//启动AD转换获取AD采样数据AD_val
AVG_AD_Vtemp();//求6次平均值(去掉2个最低去掉2个最高)
//delay(50);//延时
//delayms(10);
GETvoltage=(u16)(AD_val*0.02);//计算对应电压(mV)
uMotoSpeed = GETvoltage;
AD_val=0;//清零ADC转换数据
MotoCtrl(uMotoSpeed,uDir,uMotoStep);
if(uMotoStep<8)uMotoStep++;
else uMotoStep=0;
}
}
#pragma vector=0x07
__interrupt void EXTI_PORTC_IRQHandler(void)
{
if(PC_IDR_IDR5==0)//快速 !=
{
PC_CR2_C25=0;//禁止PB0端口外部中断
while(PC_IDR_IDR5==0);
uMotoSpeed=10;
uDir=0;
PC_CR2_C25=1;//使能PB0端口外部中断
PD_ODR = 0x00;
}
if(PC_IDR_IDR6==0)//慢速
{
PC_CR2_C26=0;//禁止PB0端口外部中断
while(PC_IDR_IDR6==0);
uMotoSpeed=10;
uDir=1;
PC_CR2_C26=1;//使能PB0端口外部中断
PD_ODR = 0x00;
}
}
void ADC_init(void)
{
//1.选择模拟通道,按需配置中断
ADC_CSR=0x00;//选择通道AIN0(PB0),禁止中断
//2.配置分频系数,明确转换模式
ADC_CR1=0x02;//配置预分频为fMaster/2,连续转换模式
//3.配置触发事件,明确对齐方式
ADC_CR2=0x08;//禁止外部触发,数据右对齐(先读低再读高)
//ADC_CR2=0x00;//禁止外部触发,数据左对齐(先读高再读低)
//4.初始配置模拟通道(无中断悬浮输入)
PB_DDR_DDR0=0;//配置PB0端口为输入模式
PB_CR1_C10=0;//配置PB0端口为悬浮输入模式
PB_CR2_C20=0;//配置PB0端口禁止外部中断
//5.按需禁止/使能施密特触发器功能
ADC_TDRL=0x00;//使能斯密特触发器
//6.使能ADC上电唤醒并禁用I/O输出功能
ADC_CR1|=0x01;//首次将ADON位置1用于唤醒
//7.启动ADC转换并获取转换数据
//ADC_GET();//用户编写的ADC转换函数
}
/****************************************************************/
//ADC2模数转换函数ADC_GET(),无形参,无返回值
/****************************************************************/
void ADC_GET(void)
{
u8 num=0;//循环控制变量,用于控制次数
ADC_CR1=0x02;//配置预分频为fMaster/2,连续转换模式
ADC_CR1|=0x01;//首次将ADON位置1用于唤醒
ADC_CR1|=0x01;//再次将ADON位置1用于启动ADC转换
while(num<10)//采10次结果
{
while((ADC_CSR & 0x80)==0);//等待ADC转换结束
ADC_CSR &= 0x7F;//清除ADC转换完成标志位
AD_Vtemp[num]=(u16)ADC_DRL;//先将ADC转换数据低位赋值
AD_Vtemp[num]|=(u16)ADC_DRH<<8;//再将左移8位后的高位数据与原低位数据进行或连接
//(高位数据)+(低位数据)=完整ADC采样数据结果
num++;//循环控制变量自增
}
ADC_CR1 &= 0xFE;//关闭ADC转换
}
/****************************************************************/
//平均值滤波函数AVG_AD_Vtemp(),无形参,无返回值
/****************************************************************/
void AVG_AD_Vtemp(void)
{
u8 i,j;//定义排序用内外层循环变量i和j
u16 temp;//定义中间“暂存”变量temp
for(i=10;i>=1;i--)//外层循环
{
for(j=0;j<(i-1);j++)//内层循环
{
if(AD_Vtemp[j]>AD_Vtemp[j+1])//数值比较
步进电机驱动程序-stm8s105K4单片机
需积分: 13 27 浏览量
2022-12-09
11:40:42
上传
评论
收藏 449KB ZIP 举报
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
yewuqiaoxi
- 粉丝: 0
- 资源: 3
最新资源
- git忽略文件的配置文件
- Koloro_v6.2.7.apk
- tensorflow-2.8.1-cp310-cp310-win-amd64.whl
- tensorflow-gpu-2.8.1-cp310-cp310-win-amd64.whl
- tensorflow-gpu-2.8.1-cp39-cp39-win-amd64.whl
- YOLOv5:基于深度学习的驾驶员分心驾驶行为(疲劳+危险行为)预警系统
- fast-backup 2.1.zip
- 室外lego-loam算法三维数据包
- mirthConnect h2database
- 基于Pyqt5+pyOpenGL实现WiFi信号强度三维模型python源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)