[PIC®/AVR®/dsPIC®产品] PIC12F675定时器无法实现100KHz输出???

[复制链接]
1876|18
 楼主| streetkid 发表于 2022-1-12 22:27 | 显示全部楼层 |阅读模式
第一次用PIC的片子,想用PIC12f675实现100KHz的PWM输出,看了下手册算了下应该是可以做1us定时的。但搞了半天最高只能输出15KHz。大家帮忙看看问题出在了哪里?
  1. #include<pic12f675.h>

  2. // CONFIG
  3. #pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
  4. #pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
  5. #pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
  6. #pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
  7. #pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
  8. #pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
  9. #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

  10. #define nop() asm("NOP")

  11. #define u8 unsigned char
  12. #define u16 unsigned int

  13. #define PWM_A GPIO2
  14. #define LED GPIO1

  15. u8 n = 0;

  16. void init(void)
  17. {
  18.     CMCON = 0x07;
  19.     ANSEL = 0x00;  
  20.     WPU |= 0x20;
  21.     TRISIO = 0x38;
  22.    
  23.     TMR0 = 0xFF;   
  24.     //OPTION_REG
  25.     T0CS = 0;
  26.     PSA = 1;
  27.    
  28.     //INTCON
  29.     T0IF = 0;
  30.     T0IE = 1;
  31.     GIE = 1;
  32. }

  33. void __interrupt(low_priority) tmer0(void)
  34. {
  35.      if(T0IF==1)
  36.          {
  37.          TMR0 = 0xFF;
  38.          T0IF = 0;
  39.          n++;
  40.          if(n==1)
  41.             PWM_A = 1;
  42.          else
  43.          {
  44.              PWM_A = 0;
  45.              n = 0;
  46.          }
  47.      }
  48. }
  49. void main(void)
  50. {
  51.     init();
  52.     while(1);
  53. }
 楼主| streetkid 发表于 2022-1-13 17:50 | 显示全部楼层
自己顶一下吧
delong_z 发表于 2022-1-13 18:39 | 显示全部楼层
楼主,用新的型号,MCC生成代码几分钟就搞定了。加我VX 13251345724
lyjian 发表于 2022-1-13 22:21 | 显示全部楼层
软件做100KHz PWM?
你是开玩笑吧
 楼主| streetkid 发表于 2022-1-14 09:23 | 显示全部楼层
lyjian 发表于 2022-1-13 22:21
软件做100KHz PWM?
你是开玩笑吧

为啥不行呢?看手册TIMR0不分频正好是1us啊,内部时钟4MHz
粤原点科技 发表于 2022-1-14 09:35 | 显示全部楼层
streetkid 发表于 2022-1-14 09:23
为啥不行呢?看手册TIMR0不分频正好是1us啊,内部时钟4MHz

PIC12F675单指令周期=(1/4000000)*4=1us,软件模拟PWM。除非其他事情都不做,CPU资源被这个软件模拟PWM一直占用,只输出PWM,并且PWM的位数极低,这样做就没意义了。
PS:跑指令也是需要时间的
lcczg 发表于 2022-1-14 11:09 | 显示全部楼层
楼上正解,楼主可以选带PWM外设的器件。
 楼主| streetkid 发表于 2022-1-14 12:10 | 显示全部楼层
粤原点科技 发表于 2022-1-14 09:35
PIC12F675单指令周期=(1/4000000)*4=1us,软件模拟PWM。除非其他事情都不做,CPU资源被这个软件模拟PWM一 ...

感谢,不过我也做啥操作啊,就消耗了60多条指令了?
lyjian 发表于 2022-1-14 12:48 | 显示全部楼层
streetkid 发表于 2022-1-14 09:23
为啥不行呢?看手册TIMR0不分频正好是1us啊,内部时钟4MHz

1uS的指令周期,你要做1uS的定时中断?中断处理不要花时间吗?
100KHz=10uS,就算是做1bit PWM,也要5uS内处理一次,这小CPU忙得过来吗?
 楼主| streetkid 发表于 2022-1-14 15:58 | 显示全部楼层
lyjian 发表于 2022-1-14 12:48
1uS的指令周期,你要做1uS的定时中断?中断处理不要花时间吗?
100KHz=10uS,就算是做1bit PWM,也要5uS ...

确实是,即使做了也是问题多多。再次感谢。
粤原点科技 发表于 2022-1-15 11:54 | 显示全部楼层
streetkid 发表于 2022-1-14 12:10
感谢,不过我也做啥操作啊,就消耗了60多条指令了?

我也不清楚你的代码怎么写的,但用定时器来做,会更加耗时,而且判断标志位和清标志,再给TMR0赋初值,再执行模拟PWM的代码,这些都是消耗,写得不够精简的话60uS是会有的。又如果开了中断,进出中断的现场保护和现场恢复是8句代码就白白耗了8uS。极端的情况下,MCU只做PWM其他事不做,并且PWM位数是1bit,也就是直接翻转IO,下面的汇编代码,GP0完成2次翻转(1个方波)需要8us((1+1+2)*2)。这么极端的做法,频率也就125KHz。所以这么低主频+机器周期长(4T)的CPU,确实不适合做高速模拟PWM。可以换个其他型号带硬件PWM的。
  1. MAIN_LOOP:
  2. MOVLW   B'00000001'
  3. XORWF   GPIO,F
  4. GOTO      MAIN_LOOP


lyjian 发表于 2022-1-15 13:02 | 显示全部楼层
粤原点科技 发表于 2022-1-15 11:54
我也不清楚你的代码怎么写的,但用定时器来做,会更加耗时,而且判断标志位和清标志,再给TMR0赋初值,再 ...

不用重复MOVLW   B'00000001'
粤原点科技 发表于 2022-1-15 13:42 | 显示全部楼层
lyjian 发表于 2022-1-15 13:02
不用重复MOVLW   B'00000001'

是的,直接在主循环外边给W放0x01即可。
 楼主| streetkid 发表于 2022-1-17 09:26 | 显示全部楼层
粤原点科技 发表于 2022-1-15 11:54
我也不清楚你的代码怎么写的,但用定时器来做,会更加耗时,而且判断标志位和清标志,再给TMR0赋初值,再 ...

感谢,学习了
aoyi 发表于 2022-2-5 17:20 | 显示全部楼层
有些整值确实是输出不了
drer 发表于 2022-2-5 17:25 | 显示全部楼层
只要在一定的容差范围内就可以了
gwsan 发表于 2022-2-5 17:29 | 显示全部楼层
只要差不了太多就可以了
kxsi 发表于 2022-2-5 17:44 | 显示全部楼层
用c如何表述呢
nawu 发表于 2022-2-5 17:50 | 显示全部楼层
好像都是一样的算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

228

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部