stm32 利用PID调整PWM值

增量式
float SpeedInnerControl(char k,int temp)
{	
    PIDpulse_add[k] = Kp * (temp - Error_Last[k]) + 									
            Ki * temp +																		
            Kd * (temp - 2.0 * Error_Last[k] + Error_Prev[k]);	//这个位置减去2.0是通式增量式pid都需要减去这个2.0
    
    PIDpulse[k] += PIDpulse_add[k];		//增量PID
    
    Error_Prev[k] = Error_Last[k];//	Error_Prev上上次误差
    Error_Last[k] = temp;	//Error_Last上次误差
    
    if(PIDpulse[k] <  0  ) PIDpulse[k] = -PIDpulse[k];
    if(PIDpulse[k] > 7200) PIDpulse[k] = 7200;
    printf("Error_Prev[%d]=%d\r\n",k,Error_Prev[k]);
    printf("Error_Last[%d]=%d\r\n",k,Error_Last[k]);
    printf("temp=%d\r\n",temp);
    printf("PIDpulse[%d]=%d\r\n",k,PIDpulse[k]);
    
    return PIDpulse[k];	
}
位置式
int SpeedInnerControl_pos(char k, int temp)
{		
    //printf("SpeedInnerControl_pos!\r\n");
    sum_temp[k]+=temp;
    PIDpulse[k] = Kp * temp + 									
            Ki * sum_temp[k] +																		
            Kd * (temp -  Error_Last[k]);	//
    //PIDpulse[k] =5000;
    Error_Last[k] = temp;	//Error_Last上次误差
    
    if(PIDpulse[k] <  0  ) PIDpulse[k] = -PIDpulse[k];
    if(PIDpulse[k] > 7200 ) PIDpulse[k] = 7200;
    printf("sum_temp[%d]=%d\r\n",k,sum_temp[k]);
    printf("temp=%d\r\n",temp);
    printf("PIDpulse[%d]=%d\r\n",k,PIDpulse[k]);
    return PIDpulse[k];
}
void RefreshPWM(char k,int temp)//计算并刷新PWM
{
    
    if(0==k)
    { 
        PID_POS[k]=SpeedInnerControl_pos(k,temp);     //PA8
        printf("PID_POS[%d]=%d\r\n",k,PID_POS[k]);
        TIM_SetCompare1(TIM1,PID_POS[k]);	
    }
    
    if(1==k)
    {
        PID_POS[k]=SpeedInnerControl_pos(k,temp);    PA11
        printf("PID_POS[%d]=%d\r\n",k,PID_POS[k]);
        TIM_SetCompare4(TIM1,PID_POS[k]);	
      
    }
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于使用 STM32F103 板载的 PWM 控制器来控制 PWM 输出的占空比,你可以按照以下步骤进行操作: 1. 配置定时器:选择一个可用的定时器(如 TIM1、TIM2 等),并根据需求配置定时器的时钟频率和预分频系数。 2. 配置 PWM 输出通道:选择一个可用的 PWM 输出通道(如通道1、通道2 等),并设置相应的 GPIO 引脚为 PWM 输出模式。 3. 配置定时器工作模式:选择 PWM 模式,并设置 PWM 的周期和占空比。 4. 初始化定时器和 PWM 输出通道:根据之前的配置,初始化定时器和 PWM 输出通道。 5. 设置占空比:通过修改定时器的 CCR(比较寄存器)寄存器的,来调整 PWM 的占空比。CCR 的取范围为 0 到定时器的自动重载。 下面是一个简单的示例代码,演示如何使用 STM32F103 板载的定时器和 PWM 控制器来实现 PWM 输出的占空比控制: ```c #include "stm32f10x.h" void PWM_Init(void) { // 配置定时器 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000; // PWM 周期为 1000 TIM_TimeBaseStructure.TIM_Prescaler = 72; // 预分频系数为 72 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置 PWM 输出通道 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置定时器工作模式 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比为 50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM1, &TIM_OCInitStructure); // 初始化定时器和 PWM 输出通道 TIM_Cmd(TIM1, ENABLE); } void PWM_SetDutyCycle(uint16_t dutyCycle) { TIM_SetCompare2(TIM1, dutyCycle); // 设置占空比 } int main(void) { PWM_Init(); while (1) { // 控制占空比 PWM_SetDutyCycle(250); // 设置占空比为 25% delay_ms(1000); PWM_SetDutyCycle(750); // 设置占空比为 75% delay_ms(1000); } } ``` 在这个示例代码中,我们初始化了一个定时器 TIM1,并配置了通道2(对应 GPIOA 的引脚 8)为 PWM 输出模式。然后,我们可以通过调用 `PWM_SetDutyCycle` 函数来设置占空比。在 `main` 函数中的示例代码中,我们以 1 秒的间隔,将占空比分别设置为 25% 和 75%。你可以根据实际需求修改占空比的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值