关于STM32103ZE管脚用PWM输出得疑惑

haoziccy 2013-09-14 10:38:56
加精

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/********* PA 6 7 ******************************/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用
GPIOA6_Out=1; GPIOA7_Out=1;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//TIM3_CH2,TIM3_CH3
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Timer_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;

TIM2->CR1 &= 0xfffe;
TIM3->CR1 &= 0xfffe;

///PWM,输出的引脚是 TIM3_CH2
TIM_TimeBaseStructure.TIM_Period = 60000;
TIM_TimeBaseStructure.TIM_Prescaler = 11; //72/12=6
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3 , &TIM_TimeBaseStructure);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //翻转模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能比较匹配输出极性
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置比较匹配输出极性
TIM_OCInitStructure.TIM_Pulse = 30000; //比较值
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //

TIM_OC2PreloadConfig(TIM3 , TIM_OCPreload_Enable); //使能 比较预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能预装载寄存器

TIM3->CR1 &= 0x3fe; // 失能 TIM 计数器
TIM3->CR2 = 0x60; // MMS[2:0] = 110 oc2匹配上发出触发信号

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

TIM2->SMCR = 0x0000; //禁用从模式的情况进行从模式配置
TIM2->SMCR |= 0x020; // TS[2:0]=010 TIM2触发源选择:TIM3的TRGI
TIM2->SMCR |= 0x007; // 使能从模式SMS[2:0]=111 使用内部触发 TRGI 即外部时钟1模式

TIM2->CNT = 0x00;
TIM3->CNT = 0x00;
TIM2->SR = 0x00;
TIM3->SR = 0x00;
TIM2->EGR =0x00;
TIM3->EGR =0x00;
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE); //使能TIM2 更新中断
TIM_ITConfig(TIM3, TIM_IT_Update,DISABLE); //失能TIM3 更新中断
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE); //DISABLE ENABLE
}
我的疑惑是 PWM输出脚TIM3_CH2 有方波出来却无法驱动后端光耦发脉冲。
但是TIM3_CH2,用做普通I/O功能的时候却可以自己编一段仿PWM输出来驱动光耦发脉冲。

我怀疑:一:PWM输出的驱动能力没有普通IO的强。
二:我的PWM输出配置有问题,请各位大大帮我看一下我的配置代码。
...全文
4989 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yygkqzh 2015-12-03
  • 打赏
  • 举报
回复
这个我能解决 楼主联系我qq825979838
zhang0804140227 2013-11-27
  • 打赏
  • 举报
回复
看不懂啊,,,,,,,,
zhengqiyuan2013 2013-11-25
  • 打赏
  • 举报
回复
真看不懂- -
yeshilin40 2013-11-25
  • 打赏
  • 举报
回复
受教了,感谢
mss1 2013-11-25
  • 打赏
  • 举报
回复
kankan...
胡仔1992 2013-11-25
  • 打赏
  • 举报
回复
不懂《《《《《《《《《
zf23119911 2013-11-24
  • 打赏
  • 举报
回复
水电费阿斯蒂芬爱的地方
XiaoBaoBeiBuQi 2013-11-24
  • 打赏
  • 举报
回复
nettman 2013-11-24
  • 打赏
  • 举报
回复
是不是w 2013-11-24
  • 打赏
  • 举报
回复
什么年代,吹着什么样风,我拿着我的麦可风
heiheiheihei220 2013-11-24
  • 打赏
  • 举报
回复
是看不懂````````````````
zouchongchao 2013-11-24
  • 打赏
  • 举报
回复
很好的东西,看看了
迷途的笑羊 2013-11-24
  • 打赏
  • 举报
回复
很好的东西,看看了
Anserhong 2013-11-23
  • 打赏
  • 举报
回复
没用过这个,你简单的加个上拉看看能不能驱动后端光耦
haoziccy 2013-09-17
  • 打赏
  • 举报
回复
引用 5 楼 wangfan027 的回复:
[quote=引用 4 楼 haoziccy 的回复:] [quote=引用 1 楼 wangfan027 的回复:] 没用过这个,你简单的加个上拉看看能不能驱动后端光耦
引用 2 楼 bjtea 的回复:
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
引用 3 楼 u012133658 的回复:
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
感谢各位的关注。我应经找到问题了。 是我的PWM的CCxIE(允许比较中断x)没有设置对。 但是现在我又遇到问题了。 我用的STM32的TIM3的PWM发脉冲,TIM2对脉冲数进行计数,计数到达设定个数时,在TIM2的中断服务函数中失能TIM3。 但是实际情况会是发的脉冲数量比我设置的数量要多1个。 不管怎么怎么改变设定个数都是会多一个脉冲。 求帮分析!![/quote] 那个从0开始数还是从1开始数导致的?[/quote] 是从0开始数的。
dceacho 2013-09-16
  • 打赏
  • 举报
回复
引用 4 楼 haoziccy 的回复:
[quote=引用 1 楼 wangfan027 的回复:] 没用过这个,你简单的加个上拉看看能不能驱动后端光耦
引用 2 楼 bjtea 的回复:
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
引用 3 楼 u012133658 的回复:
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
感谢各位的关注。我应经找到问题了。 是我的PWM的CCxIE(允许比较中断x)没有设置对。 但是现在我又遇到问题了。 我用的STM32的TIM3的PWM发脉冲,TIM2对脉冲数进行计数,计数到达设定个数时,在TIM2的中断服务函数中失能TIM3。 但是实际情况会是发的脉冲数量比我设置的数量要多1个。 不管怎么怎么改变设定个数都是会多一个脉冲。 求帮分析!![/quote] 那个从0开始数还是从1开始数导致的?
haoziccy 2013-09-16
  • 打赏
  • 举报
回复
引用 1 楼 wangfan027 的回复:
没用过这个,你简单的加个上拉看看能不能驱动后端光耦
引用 2 楼 bjtea 的回复:
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
引用 3 楼 u012133658 的回复:
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
感谢各位的关注。我应经找到问题了。 是我的PWM的CCxIE(允许比较中断x)没有设置对。 但是现在我又遇到问题了。 我用的STM32的TIM3的PWM发脉冲,TIM2对脉冲数进行计数,计数到达设定个数时,在TIM2的中断服务函数中失能TIM3。 但是实际情况会是发的脉冲数量比我设置的数量要多1个。 不管怎么怎么改变设定个数都是会多一个脉冲。 求帮分析!!
guaiwulierenOL 2013-09-15
  • 打赏
  • 举报
回复
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
bjtea 2013-09-15
  • 打赏
  • 举报
回复
PWM引脚本身就是复用的IO口,驱动能力应该是一样的; 当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑); 工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
dceacho 2013-09-14
  • 打赏
  • 举报
回复
没用过这个,你简单的加个上拉看看能不能驱动后端光耦

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧