标题:
stm32 PID 脉宽调制程序
[打印本页]
作者:
812881784
时间:
2018-10-4 16:30
标题:
stm32 PID 脉宽调制程序
通过检测电流电压的大小,改变斩波电路的PWM信号的脉宽,以实现稳压目的。
单片机源程序如下:
#include "PID.h"
u8 m=0;
u16 adn=0;
char b[20];
typedef struct PID
{
int SetPoint;
float Kp;
float Ki;
float Kd;
int NowError; //当前误差
int LastError; //上次误差
int PrevError; //上上次误差
double OUT;
}PID;
static PID sPID;
static PID *sptr = &sPID;
void PID_Init(void)
{
sptr->NowError = 0;
sptr->LastError = 0;
sptr->PrevError = 0;
sptr->Kp = 2;
sptr->Ki= 0;
sptr->Kd = 0;
sptr->SetPoint = 1241; //1241/4096*3.3=1V
sptr->OUT = 0;
}
int PIDCal(u16 actually)
{
register int ep,ei,ed,zout;
sptr->NowError = sptr->SetPoint - actually; //设定值-实际值
ep = sptr->NowError - sptr->LastError;
ei = sptr->NowError;
ed = sptr->NowError - 2*sptr->LastError + sptr->PrevError;
zout = sptr->Kp * ep + sptr->Ki * ei + sptr->Kd * ed;
sptr->OUT+=zout;
sptr->PrevError = sptr->LastError;
sptr->LastError = sptr->NowError;
if(sptr->OUT<360) sptr->OUT=360;
if(sptr->OUT>3240) sptr->OUT=3240;
return(sptr->OUT);
}
void TIM2_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseInitStruct.TIM_Period = 4999;
TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_Init(&NVIC_InitStruct);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler()
{
u16 adv;
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
if(m<3)
{
adn+=AD_read();
m++;
}
else
{
adv=adn/4;
TIM3->CCR1 = PIDCal(adv);
adn=0;m=0;
}
}
}
复制代码
#include "PWM.h"
void PWM_init(u16 a,u16 b)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_TimeBaseInitStruct.TIM_Period = a;
TIM_TimeBaseInitStruct.TIM_Prescaler = b;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_OCInitStructure.TIM_Pulse = 1799;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM3,ENABLE);
}
复制代码
所有资料51hei提供下载:
STM32PWM.rar
(389.88 KB, 下载次数: 53)
2018-10-6 22:17 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-10-6 22:17
补全原理图或者详细说明一下电路连接即可获得100+黑币
作者:
kinto
时间:
2019-7-21 15:12
实际中这个程序工作正常吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1