OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3751|回复: 1

F4板子输出PWM波控制电机,我加了一个斜波函数,PWM波是慢慢上升的,程序编译没问题,电机没反应

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-10-11
在线时间
2 小时
发表于 2020-12-17 19:48:46 | 显示全部楼层 |阅读模式
//PWM波初始化的程序
#include "init.h"
#include "gpio.h"


//斜波函数初始化
void ramp_init(ramp_function_source_t *ramp_source_type, float frame_period, uint32_t max, uint32_t min)
{
    ramp_source_type->frame_period = frame_period;       //斜波函数增加的时间间隔
    ramp_source_type->max_value = max;         //输出的最大比较值
    ramp_source_type->min_value = min;           //输出的最小比较值
    ramp_source_type->input = 0.0f;                   //输入
    ramp_source_type->out = 0.0f;                     //输出
}

//斜波函数计算,out=out+input*frame_period
void ramp_calc(ramp_function_source_t *ramp_source_type, uint32_t input)
{
    ramp_source_type->input = input;
    ramp_source_type->out += ramp_source_type->input * ramp_source_type->frame_period;
    if (ramp_source_type->out > ramp_source_type->max_value)
    {
        ramp_source_type->out = ramp_source_type->max_value;
    }
    else if (ramp_source_type->out < ramp_source_type->min_value)
    {
        ramp_source_type->out = ramp_source_type->min_value;
    }
}




//TIM2_CH1 PWM 部分初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void tim2_pwm_init(uint16_t arr,uint16_t psc)
{
        TIM_HandleTypeDef TIM2_Handler;
        TIM_OC_InitTypeDef TIM2_CH1Handler;
       
        //作用都是初始化定时器的ARR和PSC等参数
        TIM2_Handler.Instance=TIM2;
        TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
        TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
        TIM2_Handler.Init.Period=arr;
        TIM2_Handler.Init.Prescaler=psc;
        HAL_TIM_PWM_Init(&TIM2_Handler);
       
        TIM2_CH1Handler.OCMode=TIM_OCMODE_PWM1;       
        //选择模式1,计数器的值小于比较值,输出有效电平
        TIM2_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW;       
        //选择低极性,高电平有效
        TIM2_CH1Handler.Pulse=150;
        //设置比较值,此值用来确定占空比
        HAL_TIM_PWM_ConfigChannel(&TIM2_Handler,&TIM2_CH1Handler,TIM_CHANNEL_1);
       
        //在完成以上设置了之后,我们需要使能 TIM2_CH1
        HAL_TIM_PWM_Start(&TIM2_Handler,TIM_CHANNEL_1);
       
}


//定时器底层驱动,时钟使能,引脚配置
//此函数会被 HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
       
        GPIO_InitTypeDef GPIO_Initure;
       
        __HAL_RCC_GPIOA_CLK_ENABLE(); //开启 GPIOB 时钟
        __HAL_RCC_TIM2_CLK_ENABLE();        //开启 TIM2 时钟
       
        GPIO_Initure.Alternate=GPIO_AF1_TIM2;        //将PA0复用为TIM2_CH1
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;        //复用推挽输出
        GPIO_Initure.Pin=GPIO_PIN_0;
        GPIO_Initure.Pull=GPIO_PULLUP;
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}


//设置 TIM2 通道 1 的占空比
//compare:比较值
void TIM_SetTIM2Compare1(uint32_t compare)
{
        TIM2->CCR1=compare;
}


#include "gpio.h"
#include "init.h"

int main(void)
{
        tim2_pwm_init(1999,839);               //PWM波初始化,arr=1999,psc=839,周期为20ms
        ramp_function_source_t shoot;          //定义斜波函数的结构体
        ramp_init(&shoot,0.01,150,105);                        //输出最大值是150,最小值105

        while (1)
       {
                ramp_calc(&shoot,155);                //输入是155
                TIM_SetTIM2Compare1(shoot.out);        //输入PWM的比较值
                HAL_Delay(10);     //延时10ms
       }
}
       


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-6-3
在线时间
103 小时
发表于 2020-12-18 22:44:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 15:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表