搜索
bottom↓
回复: 2

关于ATtiny85的互补PWM功能及死区调节(问题己解决)

[复制链接]

出0入0汤圆

发表于 2014-6-12 00:47:55 | 显示全部楼层 |阅读模式
本帖最后由 biying 于 2014-6-12 02:11 编辑

为了用于压电蜂鸣器推挽驱动(2.66KHZ)兼密码锁功能,我选ATtiny85,片内8M时钟,快速PWM,我进ICC和CVAVR的向导功能设置发现,这两个软件居然都没有死区调节的设置。ICC更是没有互补PWM的设置,且它的PWM频率计算中,TCNT1计算的值会误导人,其实值为0就行了。cvavr中关于ATtiny85手册中DT1A寄存器的定义更是命名为:DTVALC,为什么不定义为:DTVALA?,还有DTPS1是命名为:DTPS,用它的向导出来的PWMA & B top=OCR1C模式中怎么没有这三个(DTPS1、DT1A、DT1B)寄存器的初始化?实验的结果是OC1A和OC1B有2.7KHZ的输出,但是为什么它们的互补端PB0(_OC1A) and PB3(_OC1B)没有输出呢?我自己加了以上三个寄存器的初始值也不行。有懂的朋友可以指点一下吗?谢谢!这是我用CVAVR的向导做出来的代码

找到原因了,原来CVAVR的向导不会判断你是否需要输出反相PWM,所以端口输出是错误的,改为DDRB=0x1B就可以输出两组互补PWM了。对我这个初学者来说,这向导并不可靠,一定要熟读Datasheet啊!

  1. #include <tiny85.h>

  2. // Declare your global variables here

  3. void main(void)
  4. {
  5. // Declare your local variables here

  6. // Crystal Oscillator division factor: 1
  7. #pragma optsize-
  8. CLKPR=0x80;
  9. CLKPR=0x00;
  10. #ifdef _OPTIMIZE_SIZE_
  11. #pragma optsize+
  12. #endif

  13. // Input/Output Ports initialization
  14. // Port B initialization
  15. // Func5=In Func4=Out Func3=In Func2=In Func1=Out Func0=In
  16. // State5=T State4=0 State3=T State2=T State1=0 State0=T
  17. PORTB=0x00;
  18. DDRB=0x12;

  19. // Timer/Counter 0 initialization
  20. // Clock source: System Clock
  21. // Clock value: Timer 0 Stopped
  22. // Mode: Normal top=0xFF
  23. // OC0A output: Disconnected
  24. // OC0B output: Disconnected
  25. TCCR0A=0x00;
  26. TCCR0B=0x00;
  27. TCNT0=0x00;
  28. OCR0A=0x00;
  29. OCR0B=0x00;

  30. // Timer/Counter 1 initialization
  31. // Clock source: System Clock
  32. // Clock value: 500.000 kHz
  33. // Mode: PWMA & B top=OCR1C
  34. // OC1A output: Non-Inv., /OC1A connected
  35. // OC1B output: Non-Inv., /OC1B connected
  36. // Timer1 Overflow Interrupt: Off
  37. // Compare A Match Interrupt: Off
  38. // Compare B Match Interrupt: Off
  39. PLLCSR=0x00;

  40. TCCR1=0x55;
  41. GTCCR=0x50;
  42. TCNT1=0x00;
  43. OCR1A=0x5A;
  44. OCR1B=0x5A;
  45. OCR1C=0xBB;
  46. DTPS=0x03;
  47. DTVALC=0x55;
  48. DTVALB=0x55;

  49. // External Interrupt(s) initialization
  50. // INT0: Off
  51. // Interrupt on any change on pins PCINT0-5: Off
  52. GIMSK=0x00;
  53. MCUCR=0x00;

  54. // Timer(s)/Counter(s) Interrupt(s) initialization
  55. TIMSK=0x00;

  56. // Universal Serial Interface initialization
  57. // Mode: Disabled
  58. // Clock source: Register & Counter=no clk.
  59. // USI Counter Overflow Interrupt: Off
  60. USICR=0x00;

  61. // Analog Comparator initialization
  62. // Analog Comparator: Off
  63. ACSR=0x80;
  64. ADCSRB=0x00;
  65. DIDR0=0x00;

  66. // ADC initialization
  67. // ADC disabled
  68. ADCSRA=0x00;

  69. while (1)
  70.       {
  71.       // Place your code here

  72.       }
  73. }
复制代码



然后做了个LED灯明暗变化程序

  1. #include <tiny85.h>
  2. #include<delay.h>
  3. // Declare your global variables here
  4. unsigned char LIGHT;
  5. void main(void)
  6. {
  7. // Declare your local variables here

  8. // Crystal Oscillator division factor: 1
  9. #pragma optsize-
  10. CLKPR=0x80;
  11. CLKPR=0x00;
  12. #ifdef _OPTIMIZE_SIZE_
  13. #pragma optsize+
  14. #endif

  15. // Input/Output Ports initialization
  16. // Port B initialization
  17. // Func5=In Func4=Out Func3=In Func2=In Func1=Out Func0=In
  18. // State5=T State4=0 State3=T State2=T State1=0 State0=T
  19. PORTB=0x00;
  20. DDRB=0x1B;

  21. // Timer/Counter 0 initialization
  22. // Clock source: System Clock
  23. // Clock value: Timer 0 Stopped
  24. // Mode: Normal top=0xFF
  25. // OC0A output: Disconnected
  26. // OC0B output: Disconnected
  27. TCCR0A=0x00;
  28. TCCR0B=0x00;
  29. TCNT0=0x00;
  30. OCR0A=0x00;
  31. OCR0B=0x00;

  32. // Timer/Counter 1 initialization
  33. // Clock source: System Clock
  34. // Clock value: 500.000 kHz
  35. // Mode: PWMA & B top=OCR1C        2.666khz  2组互补PWM实验,接上4只LED灯测试结果
  36. // OC1A output: Non-Inv., /OC1A connected
  37. // OC1B output: Non-Inv., /OC1B connected
  38. // Timer1 Overflow Interrupt: Off
  39. // Compare A Match Interrupt: Off
  40. // Compare B Match Interrupt: Off
  41. PLLCSR=0x00;
  42. // 没有以下三行,反相端就不会有输出
  43. DTPS=0x00;
  44. DTVALC=0x55;
  45. DTVALB=0x55;

  46. TCCR1=0x55;
  47. GTCCR=0x50;
  48. TCNT1=0x00;
  49. OCR1A=0x5D;
  50. OCR1B=0x5D;
  51. OCR1C=0xBB;


  52. // External Interrupt(s) initialization
  53. // INT0: Off
  54. // Interrupt on any change on pins PCINT0-5: Off
  55. GIMSK=0x00;
  56. MCUCR=0x00;

  57. // Timer(s)/Counter(s) Interrupt(s) initialization
  58. TIMSK=0x00;

  59. // Universal Serial Interface initialization
  60. // Mode: Disabled
  61. // Clock source: Register & Counter=no clk.
  62. // USI Counter Overflow Interrupt: Off
  63. USICR=0x00;

  64. // Analog Comparator initialization
  65. // Analog Comparator: Off
  66. ACSR=0x80;
  67. ADCSRB=0x00;
  68. DIDR0=0x00;

  69. // ADC initialization
  70. // ADC disabled
  71. ADCSRA=0x00;

  72. while (1)
  73.       {
  74.       // Place your code here
  75.        for(LIGHT=187;LIGHT>0;LIGHT--)//改变LIGHT数数值即改变PWM输出的占空比,为什么是187?因为频率设置的是2.666KHZ,OCR1C=0xBB,也就是187
  76.                 {
  77.          OCR1A=LIGHT;
  78.          OCR1B=LIGHT;
  79.          delay_ms(15); //改变延时时间,就可以改变LED灯明暗变化的速度
  80.         }
  81.       }
  82. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-6-21 23:42:13 | 显示全部楼层
我的方法:用向导后,再看手册确认

出0入0汤圆

 楼主| 发表于 2014-6-22 02:48:01 | 显示全部楼层
machao 发表于 2014-6-21 23:42
我的方法:用向导后,再看手册确认

是啊,之前我还以为向导就是万能的不会出错,这次让我明白必须熟读数据手册
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 16:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表