OpenEdv-开源电子网

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

各种方案,精确输出可控脉冲个数,尽量可控周期或占空比(脉冲 dma)

  [复制链接]

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-11-28 09:38:13 | 显示全部楼层
春晓LCX 发表于 2019-11-26 20:33
同样的配置,我用STM32ZET6无法实现一个定时器输出两路PWM 脉冲,只能输出两者中的一路,这是怎么回事?

硬件干扰吧 检查开发板引脚占用
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-11-28 09:38:40 | 显示全部楼层
a3748622 发表于 2019-11-27 08:47
补充一个   用SPI输出精准个数PWM

spi??????????????
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-11-28 09:40:14 | 显示全部楼层
一壶醉清风 发表于 2019-11-27 22:38
搞个带T或S加减速算法的吧。

发过了个spwm的你改改 正玄波数组改成st的波就好了
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2018-11-30
在线时间
26 小时
发表于 2019-11-28 14:26:14 | 显示全部楼层
nashui_sx 发表于 2019-11-28 09:38
硬件干扰吧 检查开发板引脚占用

已经解决了,谢谢回复!
回复 支持 反对

使用道具 举报

0

主题

28

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2019-6-29
在线时间
333 小时
发表于 2019-12-2 09:37:25 | 显示全部楼层
非常感謝大大的分享
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-12-11 21:28:18 | 显示全部楼层
楼主好人,还不用回复可见,很实在,帮顶。
回复 支持 反对

使用道具 举报

0

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-4-12
在线时间
15 小时
发表于 2019-12-12 13:23:37 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

0

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2013-4-12
在线时间
15 小时
发表于 2019-12-12 13:40:36 | 显示全部楼层

非常感谢分享
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2014-5-14
在线时间
112 小时
发表于 2019-12-12 15:26:21 | 显示全部楼层
楼主能否写一个HAL库的对应版本,学习一下!
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-12 15:33:30 | 显示全部楼层
yzcniuniu 发表于 2019-12-12 15:26
楼主能否写一个HAL库的对应版本,学习一下!

不用hal 无能为力了  不过都一样 对着函数换换就好了
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2014-5-14
在线时间
112 小时
发表于 2019-12-12 16:22:21 | 显示全部楼层
我需要搞一个 脉冲发生器,弄一各缓冲队列,往你面填写频率和个数,实现T型或者S型,或者高阶曲线规划曲线加减速, 我对你写的 模式6和7  ,觉得思想很强大,不知道最大能搞到多高频率呢?
我是把曲线按照离散周期,大约500us 往队列里面填充 频率,个数信息,以前都在用两个定时器 拉高拉低管脚电平,产生脉冲,发现频率 在150KHZ ~ 200KHZ差不多是极限,感觉用DMA应该可以到 1MZ
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-12 16:33:04 | 显示全部楼层
yzcniuniu 发表于 2019-12-12 16:22
我需要搞一个 脉冲发生器,弄一各缓冲队列,往你面填写频率和个数,实现T型或者S型,或者高阶曲线规划曲线 ...

http://www.openedv.com/forum.php ... d=297879&extra=你在看看这个应该思路更清晰   dma频率肯定能上去 就是写好判断追加脉冲时候防止上次的没发完就好了  我这个是简单的例子,只有基础功能
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2019-10-31
在线时间
25 小时
发表于 2019-12-12 17:10:29 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2018-8-23
在线时间
28 小时
发表于 2019-12-21 17:47:49 | 显示全部楼层
第7种能不能每路输出不同的频率呢?
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-22 09:41:21 | 显示全部楼层
tigerlee 发表于 2019-12-21 17:47
第7种能不能每路输出不同的频率呢?

一个定时器想输出不同频率的pwm只能输出比较 也是可以的
http://www.openedv.com/forum.php ... d=296687&extra=
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-12-23 16:56:23 | 显示全部楼层
nashui_sx 发表于 2019-12-22 09:41
一个定时器想输出不同频率的pwm只能输出比较 也是可以的
http://www.openedv.com/forum.php?mod=viewthr ...

那么在输出比较里面使用DMA应该也是可以的吧
世界和平
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-23 17:42:37 | 显示全部楼层
礼拜天真好 发表于 2019-12-23 16:56
那么在输出比较里面使用DMA应该也是可以的吧

可以,,,,,,,,,,,,,,,
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-12-24 08:48:48 | 显示全部楼层
nashui_sx 发表于 2019-12-23 17:42
可以,,,,,,,,,,,,,,,

q1.png
第七个例子为什么软件仿真会这样,两个通道单独看都是正常的
世界和平
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-27 19:29:06 | 显示全部楼层
礼拜天真好 发表于 2019-12-24 08:48
第七个例子为什么软件仿真会这样,两个通道单独看都是正常的

从不用仿真,检查下仿真配置吧
回复 支持 反对

使用道具 举报

0

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2019-12-8
在线时间
21 小时
发表于 2019-12-27 23:34:24 来自手机 | 显示全部楼层
学习,拓宽思路
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-12-30 17:04:31 | 显示全部楼层
本帖最后由 礼拜天真好 于 2019-12-30 18:51 编辑
nashui_sx 发表于 2019-12-27 19:29
从不用仿真,检查下仿真配置吧

请教您一个问题。

我用输出比较控制频率+DMA控制个数,测试用的代码是DMA内存地址增量模式传一个数组进CCRx寄存器,缓冲大小设置为数组长度。
请问内存地址增量模式的工作方式是:收到硬件DMA请求,开始传输(直接完成了整个数组的传输),进入相应的中断服务函数。
还是传一个,地址递增,等下一个请求,···。



世界和平
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-31 15:51:00 | 显示全部楼层
礼拜天真好 发表于 2019-12-30 17:04
请教您一个问题。

我用输出比较控制频率+DMA控制个数,测试用的代码是DMA内存地址增量模式传一个数组 ...

这个是自动的,你不用管
你看下下面两个帖子,主要是第一个
http://www.openedv.com/forum.php ... d=299117&extra=
http://www.openedv.com/forum.php ... d=297149&extra=
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-12-31 17:02:25 | 显示全部楼层
nashui_sx 发表于 2019-12-31 15:51
这个是自动的,你不用管
你看下下面两个帖子,主要是第一个
http://www.openedv.com/forum.php?mod=vie ...

看了,您的帖子都是精品。
我明白这是由DMA自动控制的。问题就是在于使用DMA改变CCRx寄存器的值,如果不是按照传一个,地址递增,等下一个DMA请求的工作方式,就无法正确的得到波形。我手头上暂时没有可以硬件测试的环境,看来需要以后再实际测试了。
世界和平
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2019-12-31 19:04:53 | 显示全部楼层
礼拜天真好 发表于 2019-12-31 17:02
看了,您的帖子都是精品。
我明白这是由DMA自动控制的。问题就是在于使用DMA改变CCRx寄存器的值,如果不 ...

就是传一个,地址递增   什么时候传是定时器捕获后触发控制的 也就是DMA_M2M_Disable模式 需要触发源的

代码可以贴上来我给你测试下,
回复 支持 反对

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2020-1-2 08:23:21 | 显示全部楼层
nashui_sx 发表于 2019-12-31 19:04
就是传一个,地址递增   什么时候传是定时器捕获后触发控制的 也就是DMA_M2M_Disable模式 需要触发源的
...

TIM1_4CHsDMACompareOutput.zip (4.08 MB, 下载次数: 100)
世界和平
回复 支持 反对

使用道具 举报

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-4-27
在线时间
87 小时
发表于 2020-1-22 18:36:08 | 显示全部楼层
如果有两路PWM用第七种方法在同一个定时器下,会不会互相影响呢?
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2020-1-23 11:46:54 | 显示全部楼层
zhenyu566 发表于 2020-1-22 18:36
如果有两路PWM用第七种方法在同一个定时器下,会不会互相影响呢?

不会,可以独立工作的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-1-14
在线时间
8 小时
发表于 2020-1-31 17:05:48 | 显示全部楼层
方法5,改为HAL就无法停止,是怎么回事
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2020-1-31 21:48:01 | 显示全部楼层
taylorle 发表于 2020-1-31 17:05
方法5,改为HAL就无法停止,是怎么回事

不知道,没用过
回复 支持 反对

使用道具 举报

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-4-27
在线时间
87 小时
发表于 2020-2-7 01:29:08 | 显示全部楼层
脉冲数量超过U16个的话,要分成多次吗?
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-10-25
在线时间
28 小时
发表于 2020-2-8 22:22:50 | 显示全部楼层
真帅!!
回复 支持 反对

使用道具 举报

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-4-27
在线时间
87 小时
发表于 2020-2-20 20:48:22 | 显示全部楼层
礼拜天真好 发表于 2019-12-23 16:56
那么在输出比较里面使用DMA应该也是可以的吧

你好   用输出比较是发什么呢CCR 里发数组吗??
回复 支持 反对

使用道具 举报

36

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2016-7-3
在线时间
87 小时
发表于 2020-3-12 16:23:23 | 显示全部楼层
楼主人真好
回复 支持 反对

使用道具 举报

36

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2016-7-3
在线时间
87 小时
发表于 2020-3-13 16:41:07 | 显示全部楼层
我用STM32401CC  TIM2 定时器通道1   PA15脚输出  进不了DMA中断,看了下DMA_GetCurrDataCounter(DMA1_Stream5);返回的值不变.好奇怪,搞了好几天了.一点头绪都没有.程序如下:

#include "tim_dma_pwm_pulse_output.h"
#include "delay.h"
#include "led.h"
u16 ZhanKongBi=0;

u16 sss=100;

void TIM2_Dma_Pwm_Pulse_Output_Test(void)
{
        u8 i=0;
       
        TIM2_Dma_Pwm_Pulse_Output_Init();
        delay_ms(5);        //延时一点,给下面的正式脉冲有个间隔,便于观察
        TIM2_Dma_Pwm_Pulse_Output(200-1,83,10,100);//周期=200*72/72000000=200us 占空比10%  10个脉冲
        while(1)
        {


                sss=DMA_GetCurrDataCounter(DMA1_Stream5);

                delay_ms(1000);

        }
}
void TIM2_Dma_Pwm_Pulse_Output_Init(void)
{
        GPIO_InitTypeDef         GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef        TIM_OCInitStructure;
        DMA_InitTypeDef          DMA_InitStructure;
        NVIC_InitTypeDef         NVIC_InitStructure;

        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);  //设置缺省值,这一步最好加上防止放到串口初始化后出问题
        TIM_OCStructInit(&TIM_OCInitStructure);          //设置缺省值,这一步最好加上防止放到串口初始化后出问题
        //TIM_ICStructInit(&TIM_ICInitStructure);        //设置缺省值,这一步最好加上防止放到串口初始化后出问题

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器3时钟
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
               
//        RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA1, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_TIM2); //GPIOF9复用为定时器14
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;           //GPIOF9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PF9


        //初始化TIM3
        TIM_TimeBaseStructure.TIM_Period = 65535;                    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =0;                      //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;                 //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);         
       
                 
        //初始化TIM3 Channe1 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM2, &TIM_OCInitStructure);                     //初始化通道1
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);            //使能TIM3在通道1上的预装载寄存器


        DMA_DeInit(DMA1_Stream5);  //将DMA的通道1寄存器重设为缺省值
        while (DMA_GetCmdStatus(DMA1_Stream5) != DISABLE){}//等待DMA1_Stream4可配置
        DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_FEIF5|DMA_IT_DMEIF5|DMA_IT_TEIF5|DMA_IT_HTIF5|DMA_IT_TCIF5);//清空DMA1_Stream4上所有中断标志

  DMA_InitStructure.DMA_Channel = DMA_Channel_3;  //通道0 SPI2_TX通道
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&TIM2->CCR1;               //DMA外设基地址
        DMA_InitStructure.DMA_Memory0BaseAddr     = (u32)&ZhanKongBi;               //DMA内存基地址
        DMA_InitStructure.DMA_DIR                = DMA_DIR_MemoryToPeripheral;          //DMA_DIR_PeripheralSRC:从外设读  DMA_DIR_PeripheralDST:从内存读
        DMA_InitStructure.DMA_BufferSize         = 0;                              //DMA通道的DMA缓存的大小,实测不加1少一个,应该是最后一个还没输出就中断关闭定时器了,+1就好了
        DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;      //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc          = DMA_PeripheralInc_Disable;      //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度为8位
        DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;    //数据宽度为8位
        DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;                //工作在正常模式
        DMA_InitStructure.DMA_Priority           = DMA_Priority_Medium;            //DMA通道 x拥有中优先级
//        DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
  
//        DMA_DoubleBufferModeConfig(DMA1_Stream3,(u32)buf1,DMA_Memory_0);//双缓冲模式配置

  DMA_DoubleBufferModeCmd(DMA1_Stream5,DISABLE);//双缓冲模式开启               
               
                //是否开启内存到内存传输(关闭表示只有事件产生才传输一次数据,开启表示一直传输)DMA_M2M_Disable:非存储器到存储器模式(关闭内存到内存模式)  DMA_M2M_Enable:启动存储器到存储器模式(开启内存到内存模式)
        DMA_Init(DMA1_Stream5, &DMA_InitStructure);                               //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器                 

// TIM_DMAConfig(TIM2,TIM_DMABase_CCR1,1);
//        DMA_Cmd(DMA1_Stream5, ENABLE);               //DMA1_3使能
        TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);     //定时器3TIM_DMA_Update使能
       
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;   
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;      
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       
//        DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_FEIF5|DMA_IT_DMEIF5|DMA_IT_TEIF5|DMA_IT_HTIF5|DMA_IT_TCIF5);//清空DMA1_Stream4上所有中断标志
        DMA_ITConfig(DMA1_Stream5,DMA_IT_TC,ENABLE);                              //开传输完成中断
       
        TIM_SetCompare1(TIM2,0);       //通道1
        TIM_Cmd(TIM2, ENABLE);         //使能TIM3
}
void TIM2_Dma_Pwm_Pulse_Output(u16 arr,u16 psc,u8 zhankongbi_temp,u16 geshu)
{
        TIM_SetAutoreload(TIM2,arr);                               //设置重装载寄存器
        TIM_PrescalerConfig(TIM2,psc,TIM_PSCReloadMode_Immediate); //设置定时器时钟分频,立即生效

        ZhanKongBi=(arr+1)*zhankongbi_temp/100;                    //计算占空比
        TIM_SetCompare1(TIM2,ZhanKongBi);                          //占空比填入比较寄存器
       
        DMA_Cmd(DMA1_Stream5, DISABLE);                           //DMA失能才能设置
        while (DMA_GetCmdStatus(DMA1_Stream5) != DISABLE){}        //确保DMA可以被设置  
        DMA_SetCurrDataCounter(DMA1_Stream5,geshu+1);             //设置DMA长度,即脉冲数量
        DMA_Cmd(DMA1_Stream5, ENABLE);                            //开启
               
}

void DMA1_Stream5_IRQHandler(void)//脉冲输出完毕,关闭定时器
{
       
          
    if(DMA_GetITStatus(DMA1_Stream5,DMA_IT_TCIF5))
    {
                        TIM_SetCompare1(TIM2, 0);
                        RED=!RED;  
    }
                DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_FEIF5|DMA_IT_DMEIF5|DMA_IT_TEIF5|DMA_IT_HTIF5|DMA_IT_TCIF5) ;  
}

回复 支持 反对

使用道具 举报

36

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2016-7-3
在线时间
87 小时
发表于 2020-3-13 16:42:43 | 显示全部楼层
小萧萧 发表于 2020-3-13 16:41
我用STM32401CC  TIM2 定时器通道1   PA15脚输出  进不了DMA中断,看了下DMA_GetCurrDataCounter(DMA1_Strea ...

可以输出波形,但是它一直输出,不是输出一定的数量后停止.
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-4-30
在线时间
8 小时
发表于 2020-5-18 15:02:57 | 显示全部楼层
mark后续学习
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-7-13
在线时间
2 小时
发表于 2020-7-17 16:03:38 | 显示全部楼层
大神,请教一下,如果按照第七种方式的话,tim3虽然可以产生两路pwm波,但是这两路pwm波的频率是必须一致的吧
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2020-7-17 16:15:44 | 显示全部楼层
Aqimo 发表于 2020-7-17 16:03
大神,请教一下,如果按照第七种方式的话,tim3虽然可以产生两路pwm波,但是这两路pwm波的频率是必须一致的吧

是的,频率不同用输出比较吧
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-11
在线时间
6 小时
发表于 2020-7-18 09:33:28 | 显示全部楼层
谢谢楼主的分享!
回复 支持 反对

使用道具 举报

21

主题

217

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2123
金钱
2123
注册时间
2017-12-11
在线时间
460 小时
发表于 2020-7-18 13:42:53 | 显示全部楼层
感谢楼主分享!
回复 支持 反对

使用道具 举报

5

主题

31

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-5-20
在线时间
36 小时
发表于 2020-9-8 13:26:19 | 显示全部楼层
mark 一下
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-8-27
在线时间
4 小时
发表于 2020-9-23 19:53:34 | 显示全部楼层
第六个,为什么TIM3_CH1用的是DMA的通道3呀,不应该是通道6吗
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2020-9-24 15:46:48 | 显示全部楼层
伊人醉520 发表于 2020-9-23 19:53
第六个,为什么TIM3_CH1用的是DMA的通道3呀,不应该是通道6吗

第六个用的TIM3_UP  所以才有第七个
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2018-1-18
在线时间
22 小时
发表于 2020-11-25 11:31:29 | 显示全部楼层
学习路过,膜拜
回复 支持 反对

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2015-5-13
在线时间
30 小时
发表于 2020-11-25 13:49:58 | 显示全部楼层
路过为你的无私奉献点个赞
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-8-27
在线时间
4 小时
发表于 2020-11-26 18:06:58 | 显示全部楼层
大佬,第六种方式示波器上观测周期有波动是怎么回事。
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2020-11-26 20:38:58 | 显示全部楼层
伊人醉520 发表于 2020-11-26 18:06
大佬,第六种方式示波器上观测周期有波动是怎么回事。

不会吧,换换7   这就是个简单的例子 自己好好优化下就好了
回复 支持 反对

使用道具 举报

17

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2021-1-19
在线时间
56 小时
发表于 2021-2-25 16:18:27 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-11-8
在线时间
19 小时
发表于 2021-9-9 20:08:15 | 显示全部楼层
大佬,6.1与6.2之间以及7.1与7.2有什么区别?
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2021-9-9 20:21:28 | 显示全部楼层
YBQ140 发表于 2021-9-9 20:08
大佬,6.1与6.2之间以及7.1与7.2有什么区别?

区别看名字就知道了,就名字对应的区别
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 08:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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