本帖最后由 panxiaoyi 于 2021-11-8 14:46 编辑
上面的帖子已经更新,源代码可以下载,下面是部分源代码
//STM8S105_IAR_V3.11
//本例由panxiaoyi(QQ68354248)原创,并在21ic.com首发,转载请保留,谢谢!
#include "stdio.h"
#include "iostm8s105k4.h"
#include "SYSTEM.h"
#include "UART.h"
#include "ADC.h"
#include "TIME.h"
#include "PID.h"
#define KP 60
#define KI 190
#define KD 0
#define ADC4 529 //南北Y
#define ADC5 522 //东西X
#define HA_OUT PD_ODR_ODR3 //A组是南北方向
#define HB_OUT PD_ODR_ODR4
unsigned char i;
unsigned short adc_dat;
short gap; //差距
short amend; //修正值
//-----------------------------------------------
#pragma vector=15+2 //更新/上溢出/中断向量
__interrupt void TIM3_UPD_OVF_BRK_IRQHandler(void)
{
TIM3_CCMR1_OC1M=0; //冻结模式
TIM3_CCMR2_OC2M=0; //冻结模式
if(i) //读取调整A组
{
ADC_Start(4);
adc_dat=ADC_Read();
gap=adc_dat-ADC4;
if(gap>150) gap=150;
if(gap<(-150)) gap=(-150);
amend=PID(gap,KP,KI,KD); //注意数据是否会溢出
//printf("A %d ",adc_dat);
if(amend>0)
{
TIM3_CH1_OutOnePulse(1,amend); //输出H电平的调整单脉冲
HA_OUT=0; //当脉冲输出H电平时,本配对要输出0电平来配对
}
else
{
TIM3_CH1_OutOnePulse(0,(0-amend)); //输出反相单脉冲
HA_OUT=1;
}
}
else //------------------------------------------ //读取调整B组
{
ADC_Start(5);
adc_dat=ADC_Read();
gap=adc_dat-ADC5;
if(gap>150) gap=150;
if(gap<(-150)) gap=(-150);
amend=PID2(gap,KP,KI,KD); //注意数据是否会溢出
//printf("B %d\n",adc_dat);
if(amend>0)
{
TIM3_CH2_OutOnePulse(1,amend); //输出H电平的调整单脉冲
HB_OUT=0; //当脉冲输出H电平时,本配对要输出0电平来配对
}
else
{
TIM3_CH2_OutOnePulse(0,(0-amend)); //输出反相单脉冲
HB_OUT=1;
}
}
PE_ODR_ODR5=~PE_ODR_ODR5;
TIM3_SR1_UIF=0; //清零更新中断标志
i=~i;
}
//-----------------------------------------------
int main( void )
{
SYSTEM_Init(); //系统初始化
UART2_Init(); //串口2初始化
ADC_Init(4); //初始化ADC
IO_Init();
TIM3_OnePulseInit(); //单脉冲初始化
printf("QQ68354248\n"); //发送字符串变量
asm("RIM"); //插入汇编,使能全局中断
TIM3_CH1_OutOnePulse(1,100);
while(1);
}
|