STM32F407ZGT6 TIM4_CH1 PWM频率可调,占空比可调

本文介绍了一段用于STM32微控制器的代码,该代码实现了一个使用定时器TIM4的PWM(脉冲宽度调制)信号初始化过程。通过设置预分频器、周期寄存器和捕获/比较寄存器,可以调整PWM信号的频率和占空比。代码还包含了GPIO初始化和时钟使能等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多,直接上代码

void TIM41_PWM_Init(u32 arr, u32 CCR1_Val )
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
    
        //Fpwm = 84M / (arr+1) / (99 + 1)
        arr =  840000 / arr - 1;
        //duty circle = CCR4_Val / arr * 100
        CCR1_Val = (CCR1_Val * arr) / 100;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);    

        GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        TIM_TimeBaseStructure.TIM_Prescaler=99;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period=arr;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

        TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OC1Init(TIM4, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

        TIM_ARRPreloadConfig(TIM4,ENABLE);
        TIM_Cmd(TIM4, ENABLE);
}


int main(void)
{ 
    TIM41_PWM_Init(10000, 90);    
   while(1) 
    {

    }
}

 

STM32F407ZGT6定时器10(TIM10)通常用于生成1 kHz方波信号,可以按照以下步骤配置: 1. **初始化定时器10**: 首先,你需要在STM32CubeMX或HAL库中配置定时器10。选择`TIM10`,设置时钟源,如外接分频后的APB1或APB2时钟。确保使能计数模式PWM输出。 2. **设置基本定时器配置**: - **Prescaler设置**:为了得到1 KHz,一般需要选择一个合适的预分频器(例如,如果使用APB1时钟源,即72 MHz,那么预设值可能是72000 / (你的系统时钟频率 / 2))。确保预设值使得定时器溢出周期大约等于1秒。 - **Capture Compare Register(CCR)设置**:将CCRx寄存器设置为接近1000(取决于你的系统精度需求),这样当计数值达到这个值时,会产生中断并切换到下一个计数阶段。 3. **PWM模式配置**: - 启用PWM输出通道,比如 TIM10_CH1 PWM。配置适当的占空比,例如50%(对应1 kHz方波)。 - 如果使用外部事件触发(例如外部中断或计数溢出),确保相应的中断已启用,并连接外部触发信号。 4. **启动定时器**: 执行TIM_TimeBaseInit()函数开始定时器。 ```c // 示例代码片段 TIM_HandleTypeDef htim10; TIM_ClockConfigTypeDef sClockSourceConfig; htim10.Instance = TIM10; // ...其他配置... sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_APB1; TIM_ConfigClock(&htim10, &sClockSourceConfig); TIM_MasterConfigTypeDef sMasterConfig; sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_SLAVEMODE_DISABLE; TIM_MasterConfig(&htim10, &sMasterConfig); TIM_OC_InitTypeDef sOCPulse; sOCPulse.OCMode = TIM_OCMODE_PWM1; // 设置为PWM模式 sOCPulse.Pulse = (uint16_t)(72000 / 1000); // 设置近似1000的脉冲宽度 sOCPulse.OCPolarity = TIM_OCPOLARITY_HIGH; sOCPulse.OCFastMode = TIM_OCFAST_DISABLE; TIM_OCConfig(&htim10, TIM_CHANNEL_1, &sOCPulse); // 对于TIM10 CH1 TIM_Cmd(&htim10, ENABLE); // 开启定时器 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值