我刚学STM32,板子是F103mini,这个困扰我好几天了,麻烦解答一下,感激不尽!!!
PWM、ADC单独使用都没问题。我是用定时器1输出PWM来控制舵机,ADC转换传感器的模拟量(ADC中断读取,禁止扫描模式,连续转换,ADC时钟9MHZ)。通过ADC转换后的数值来判断情况,再调PWM占空比。但两个一起用就不行,原本舵机我让它0~180度来回转动,加了ADC初始化后,舵机就一卡一卡的。用示波器看PWM的波形,它变化幅度、频率都不稳定。(是不是我的ADC采样时间有问题)
同样PWM加上个基本定时器中断之后(500ms输出一次串口,输出操作是写在主函数里的),PWM和串口都用不了,单独使用没问题。基本定时器初始化用了就立马不行。是定时器中断太频繁了影响PWM吗?还是PWM的定时器初始化和基本定时器初始化哪里冲突了?刚学32,好多不懂,求解答!谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
今天换了个ADC+DMA读取就没影响了。虽然不知道为什么ADC中断不行,但不管了
嗯,我把main放下面了,完整的下面也上传了附件,麻烦看看
uint16_t PwmC=17;
int main(void)
{
ALL_Init(); // 多个模块初始化
while (1)
{
if (!PwmC) {
PwmC=17;
PWM_around(); // 循环转动舵机
}
Usart_printf(); // 定时器中断串口输出AD值
Scan_fire(); // 扫描到火焰时操作
}
}
void PWM_around(void)
{
static u8 Mode=0;
TIM1->CCR1=x;
if (!Mode){ // 45 to 255
x+=2;
if (x>=255) {
Mode=1;
x=255;
}
}
else{
x-=2;
if (x<=45){
Mode=0;
x=45;
}
}
}
void BASIC_TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET )
{
time++;
if (PwmC)
PwmC--;
TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
}
}
只改了红 {MOD}标记处, 加了一个全局变量, 试一下吧
一周热门 更多>