OpenEdv-开源电子网

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

用定时器3产生40KHZ的方波,最大只能达到1KHZ,是怎么回事,付程序

[复制链接]

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2016-1-19 18:54:55 | 显示全部楼层 |阅读模式
5金钱
为什么中断只能达到1KHZ,谁有示波器,帮忙看看,可以自己该分频数,TIM3中断函数在interrupt中

中断方式.zip

663.18 KB, 下载次数: 238

最佳答案

查看完整内容[请看2#楼]

TIM_Period=100; TIM_Prescaler=17; TIM_Pulse =50; 你试试,应该是40KHz的,然后输出占空比是50%的PWM方波 72000Khz进行(TIM_Prescaler+1)分频,然后除以TIM_Period就得到方波的频率,TIM_Pulse /TIM_Period是得到方波的占空比 乐意的话加个群 305127575[/backcolor] 我新建的一个QQ群,还没多少人,欢迎你的加入哈
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-19 18:54:56 | 显示全部楼层
本帖最后由 yuanxinfei 于 2016-1-20 11:55 编辑
Sun_Fly 发表于 2016-1-20 09:40
这3个值怎么给呢?我手头没有示波器,不知道产生的事多HZ的平率

TIM_Period=100;
TIM_Prescaler=17;
TIM_Pulse =50;
你试试,应该是40KHz的,然后输出占空比是50%的PWM方波
72000Khz进行(TIM_Prescaler+1)分频,然后除以TIM_Period就得到方波的频率,TIM_Pulse /TIM_Period是得到方波的占空比
乐意的话加个群 305127575 我新建的一个QQ群,还没多少人,欢迎你的加入哈
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-19 23:02:57 | 显示全部楼层
用PMW?
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2014-10-9
在线时间
95 小时
发表于 2016-1-20 09:02:24 | 显示全部楼层
本帖最后由 yuanxinfei 于 2016-1-20 09:09 编辑

TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
TIM_OCInitTypeDef          TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_TimeBaseStructure.TIM_Period = 359;
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 20;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);         
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);         

         
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);

对应着我的PWM配置,由TIM_Prescaler和TIM_Period 控制波的频率,TIM_Pulse控制占空比
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2016-1-20 09:39:38 | 显示全部楼层

不会用PWM不知道怎么给占空比,和重载值
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2016-1-20 09:40:25 | 显示全部楼层
yuanxinfei 发表于 2016-1-20 09:02
TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
TIM_OCInitTypeDef          TIM_OCInitStructu ...

这3个值怎么给呢?我手头没有示波器,不知道产生的事多HZ的平率
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-1-20 09:48:30 | 显示全部楼层
按照原子哥说的公式:
Tout=((arr+1)*(psc+1))/Tclk;---公式的由来去查原子哥的书。
tim3的Tclk=72MHZ
Tout单位是us
Timerx_Init(100,7200-1) --- 100*7200/72M=10000*72/72=10000us=10ms
Timerx_Init(10,7200-1)---1ms---1k
Timerx_Init(10,720-1)---0.1ms---10k
Timerx_Init(10,72-1)---0.01ms---100k
注意:管脚要配置成50MHZ输出模式,中断里不要有太多的指令。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2016-1-20 10:35:42 | 显示全部楼层
fanghuiopenedv 发表于 2016-1-20 09:48
按照原子哥说的公式:
Tout=((arr+1)*(psc+1))/Tclk;---公式的由来去查原子哥的书。
tim3的Tclk=72MHZ

设置了 不管用,你有产生40KHZ方波的程序吗
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-1-21 09:19:45 | 显示全部楼层
本帖最后由 fanghuiopenedv 于 2016-1-21 09:30 编辑
Sun_Fly 发表于 2016-1-20 10:35
设置了 不管用,你有产生40KHZ方波的程序吗
把你程序里面tim3中断函数中的俩个printf给去了!!!你还想搞中断嵌套?
你可以考虑用pwm输出,但pwm输出要指定管脚。

中断里可以这样写:(具体输出用示波器测量,别用串口打印!)
void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
                LED1=!LED1;
        }

}

原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-1-21 09:32:37 | 显示全部楼层
void Timerx_Init(unsigned int arr,unsigned int psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        /* TIM3 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //ÏèÕ¼óÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //′óóÅÏè¼¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
       
        TIM_TimeBaseStructure.TIM_Period = arr; /* éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         ¼Æêyμ½5000Îa500ms */
        TIM_TimeBaseStructure.TIM_Prescaler =psc-1; /*éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  10KhzμļÆêyÆμÂê  */
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; /*éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim */
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /*TIMÏòéϼÆêyÄ£ê½*/
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ*/
        TIM_ITConfig(TIM3, TIM_IT_Update | TIM_IT_Trigger,ENABLE );

        TIM_Cmd(TIM3, ENABLE);  /*ê1ÄüTIMxíaéè */

}
中断配置如上。
(当然别忘记了配置这货: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);)
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2016-1-21 10:52:40 | 显示全部楼层
fanghuiopenedv 发表于 2016-1-21 09:32
void Timerx_Init(unsigned int arr,unsigned int psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStr ...

非常感谢。我想问一下你用过SI4432无线模块吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 15:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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