73人参与 • 2024-08-06 • stm32
我用的单片机是stm32f103cbtx
以下是使用逻辑分析仪观察到的pwm输出情况
参考别人的试了用了circular模式,完全没问题,可以成功测出电压值。
我自己也试了normal模式,不行,只能测一次,后面没反应了。
uint8_t adcconvend=0;
int main()
{
uint16_t adc_value[4]= 0;
hal_tim_base_start(&htim1);
hal_tim_pwm_start(&htim1, tim_channel_2);
hal_adcex_calibration_start(&hadc1);//自动校准
hal_adc_start_dma(&hadc1, (uint32_t *)adc_value, 4);
while(1)
{
if(adcconvend)
{
uint16_t averagevalue = 0;
for(int i = 0; i < 4; i++)
{
averagevalue += adc_value[i];
printf("adc_value[%d]:%.3f\r\n",i,(float)adc_value[i]*3.3f/4096);
}
adcconvend=0;
averagevalue/=4;
printf("averagevalue:%d\r\n",averagevalue);
}
}
void hal_adc_convcpltcallback(adc_handletypedef* hadc)
{
if(hadc==&hadc1)
{
adcconvend=1;
}
}
*注 :* arr和psc都是16位的寄存器, 数值一定要在0~65535这个范围。
当我们设置了当前机器设置的是 72mhz和 72分频,定时器输入时钟频率是72mhz / 72 = 1mhz:
若重装载值 (period 或 arr)设置为 500。也就是0.1us*500=500us,对于当前 pwm 周期为 500us,也就是500us发生一次中断。
上图可以看出:
当timx_cnt值达到arr时,定时器溢出,重新向上计数...循环此过程至此一个pwm周期完成。
上图更加形象的说明了
信号频率由 timx_arr 寄存器值决定。
占空比则由 timx_ccrx 寄存器值决定。
参考:
stm32 hal库:adc+dma应用(连续采样、触发采样)_hal adc dma-csdn博客
【stm32】定时器tim触发adc采样,dma搬运到内存(超详细讲解)-csdn博客
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论