STM32 如何实现1HZ频率 1us脉宽 PWM

2019-08-17 09:49发布

STM32 如何实现1HZ频率 1us脉宽可调   PWM
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
39条回答
mack13013
1楼-- · 2019-08-19 08:50
本帖最后由 mack13013 于 2016-7-19 15:00 编辑
mack13013 发表于 2016-7-19 14:49
干脆你就设置一个1us的PWM输出给一个输入捕获,捕获里面计数,根据计数反转某个引脚就可以了。
硬件上仅 ...

我擦,没考虑清楚。

没法用1us进行输入捕获,因为进入中断的速度太频繁了。

那可以看看定时器的单脉冲输出模式输出一个1us,软件定时1s,
或者用一个定时器输出比如50ms,然后输入捕获计数,计数到1s之后启动另一个定时器进行单脉冲模式输出1us,估计这样精度会高一些,进入中断也不至于太频繁。就是外设用的太多了。

定时器同步一节了还有一个定时器用作另一个定时器的预分频什么的,但是这样做得在外部添加逻辑芯片进行与或非什么的组合,还不如F1换F4。
wszdxmh
2楼-- · 2019-08-19 10:36
[mw_shl_code=c,true]void TIM1_Init(uint16_t period, uint16_t prescaler)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //ê±Öóê1Äü
        //¶¨ê±Æ÷TIM43õê¼»ˉ
        TIM_TimeBaseStructure.TIM_Period = period; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔؼÄ′æÆ÷ÖüÆúμÄÖμ       
        TIM_TimeBaseStructure.TIM_Prescaler = prescaler; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //ê1ÄüÖ¸¶¨μÄTIM4ÖD¶Ï,ÔêDí¸üDÂÖD¶Ï
        //ÖD¶ÏóÅÏ輶NVICéèÖÃ
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM1ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //ÏèÕ¼óÅÏ輶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óóÅÏ輶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //3õê¼»ˉNVIC¼Ä′æÆ÷
        TIM_Cmd(TIM1, ENABLE);  //ê1ÄüTIMx                       
}

void TIM1_UP_IRQHandler(void)
{
    static long a;
        if(TIM_GetITStatus(TIM1, TIM_IT_Update))
        {
        a++;
        if(a == 1000000)
            a=0;
        if(a<b)
            led=1;
        else
            led=0;
                TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //&#199;&#229;3yTIMx&#184;üD&#194;&#214;D&#182;&#207;±ê&#214;&#190;
        }
}

void main(void)
{
    TIM1_Init(49999,1439);
    led_init();
    while(1);
}[/mw_shl_code]
用定时器模拟PWM,1us中断一次;改b值就可以控制占空比。
Y-Hanxiao
3楼-- · 2019-08-19 15:19
wszdxmh 发表于 2016-7-19 16:50
[mw_shl_code=c,true]void TIM1_Init(uint16_t period, uint16_t prescaler)
{
  TIM_TimeBaseInitTypeDe ...

你试过吗?速度达不到,我测试这样置0置1  最快就能到2us,到不了1us。
wszdxmh
4楼-- · 2019-08-19 15:26
 精彩回答 2  元偷偷看……
Y-Hanxiao
5楼-- · 2019-08-19 20:40
wszdxmh 发表于 2016-7-20 14:22
我都是用硬件PWM做的,但是你这个用硬件PWM做不了,所以就写一软件模拟。引脚最高响应频率是50MHz,所以 ...

达不到要求 还写。。。
wszdxmh
6楼-- · 2019-08-19 20:58
Y-Hanxiao 发表于 2016-7-20 14:29
达不到要求 还写。。。

写的时候没想到这个问题。你后面问了我才想起来。你想用STM32实现基本上是没戏了。用其他芯片吧。GPIO外设都是挂APB这个低时钟系统总线上的。

一周热门 更多>