|
以下为源代码,CC1进行比较输出,模式为翻转电平. ' j6 q( [1 U$ F1 p 程序运行后,CC中断可以进去,PA.11的指示灯能闪,但PA.08的指示一直为低电平,请教一下程序哪里错了??? void TIM1_CC_Init(void)# `0 `( L! d5 I! t$ W0 u$ G { 7 v/ t& N% N# ~5 z7 _9 H NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; ) z' t1 t! m. K4 j) X2 Z; O+ \* u- u /* 使能定时器 TIM1_CC 中断 */! z" R: K A9 T. K- } NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;3 `5 {! B) I! E9 r& \: \. K3 [ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;! A3 s) W' t% C/ M NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 1 a/ l8 x# L( ` /* 配置 PA.11 为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; . ]8 u9 l) I/ {5 f/ L; q GPIO_Init(GPIOA, &GPIO_InitStructure);* v V1 C6 A4 K GPIOA->BSRR = GPIO_Pin_11; // 将PA.08配置为高电平 /* 配置 PA.08 为复用推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 9 ^# ^# B5 a6 A1 _, N8 C1 d5 \( v5 ` GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ) o, ^% q4 Q2 s8 K* f GPIO_Init(GPIOA, &GPIO_InitStructure);( m) d8 X3 m" w; H 2 [# p6 c7 d5 p; i u /* 预分频自动重载寄存器 */) T, A, f5 Y. w0 P5 x+ ~ TIM1->ARR = 0x2FFF; + m5 t( P0 V6 A9 q/ r- U /* PSC 预分频器:计数频率 = CK_PSC /(PSC + 1) */ TIM1->PSC = 0xFF; /* CCR1 捕获比较值寄存器 */ , K- z/ @7 y6 z, U! r1 x TIM1->CCR1 = 0xFFF; 8 z$ ?4 P$ U6 `9 ]9 _! ]% ~8 k /* 循环计数器的寄存器(控制更新事件) */* o2 A$ b# V. l1 v TIM1->RCR = 0x00; // 每次更新 /* 捕获/比较模式寄存器 */2 |* ~9 M, P% I0 h, ?; Y TIM1->CCMR1 = 0x30; // CC1为输出,CCR1立即生效,输出翻转. 4 T7 x5 h1 f- w' U% } /* 捕获/比较使能寄存器 */ ! v7 [( v' b) N8 R7 [1 y TIM1->CCER = 0x03; // 开启CC1输出,反向输出 2 j/ y t; }* {8 K) Y* A /* 中断使能寄存器 */, \" R7 E# o2 o TIM1->DIER = 0x02; // 使能 CC1 中断 ) x( e. t# Z7 T3 _ /* 控制寄存器1 */2 |( }$ G/ b' O* h3 V- p* b TIM1->CR1 = 0x01; // 使能计数器(向上计数) }, n! w: f. G- }) w7 {% k /*************************************************************************************** ** 函数名称: TIM1_CC_IRQHandler- N0 ]% O0 I4 h6 k5 K7 c7 Z ** 功能描述: CC 中断8 f! b/ A( r( e6 T ** 参 数: None ** 返 回 值: None g( _# f% @5 i# h A- m ****************************************************************************************/ void TIM1_CC_IRQHandler(void) { static uint32 counter = 0; TIM1->SR &= ~2; // 清除中断标志(不做判断提高效率) ' h0 M: |3 }& T$ `( q0 U. y if(counter)& H, B' H4 A' l! n {4 U% S; j7 U. m( L+ h5 n) [4 r counter = 0; GPIOA->BSRR = GPIO_Pin_11;6 g( d8 \ u7 Y }3 E5 o8 }& F, w4 x+ s W else { counter = 1; GPIOA->BRR = GPIO_Pin_11; }# Z, i5 K( e/ z } |
微信公众号
手机版
RE:STM32基于TIM1的比较输出
找到问题,没有打开主输出.../ B: b9 c) f, o5 z3 b' X
/* 打断和死区控制器 */
TIM1->BDTR = 0x8000; // 主输出使能(MOE)
加这句就可以了.
RE:STM32基于TIM1的比较输出
RE:STM32基于TIM1的比较输出
我刚接触到STM32F103这款芯片,同时也要使用TIM1高级时钟这个模块,主要是用来控制电机,但发现互初输出的PWM信号的占空比不正确,譬如:软件中设置的占人比为20%,但实际输出才有16%,其它的占空比都是一样,存在误差!
ps:我的PWM信号频率为20KHZ,死区时间:2us,中心对齐,下溢中断: j2 T; D2 t0 W* k8 l3 ^/ Z- a
谢谢