|
上次也發(fā)過類似的帖子 但是那個(gè)帖子 里面調(diào)節(jié)頻率的時(shí)候 精度不是特別的高 現(xiàn)在修改了方法 精度還是可以的
利用電位器調(diào)節(jié) 占空比也可以調(diào)節(jié) 這樣方便驅(qū)動(dòng)電動(dòng)機(jī) 調(diào)節(jié)燈泡的亮度
下面上圖 有偶數(shù)HZ 奇數(shù)HZ 目的就是檢查精度怎么樣
HZ數(shù) 請(qǐng)看數(shù)碼管前兩位即可 其它不用管
1.jpg (221.27 KB, 下載次數(shù): 51)
下載附件
2021-9-16 21:59 上傳
1-1.jpg (318.4 KB, 下載次數(shù): 47)
下載附件
2021-9-16 21:59 上傳
13.jpg (205.44 KB, 下載次數(shù): 48)
下載附件
2021-9-16 21:59 上傳
13-1.jpg (285.18 KB, 下載次數(shù): 59)
下載附件
2021-9-16 21:59 上傳
18.jpg (239.35 KB, 下載次數(shù): 55)
下載附件
2021-9-16 21:59 上傳
18-1.jpg (403.77 KB, 下載次數(shù): 54)
下載附件
2021-9-16 21:59 上傳
24.jpg (441.54 KB, 下載次數(shù): 41)
下載附件
2021-9-16 21:59 上傳
24-1.jpg (240.31 KB, 下載次數(shù): 35)
下載附件
2021-9-16 21:59 上傳
下面是單片機(jī)程序 不對(duì)的地方 請(qǐng)大家指教
- #include <STC15F2K60S2.H>
- #include "intrins.h"
- //數(shù)碼管延時(shí)
- void Delay100us() //@24.000MHz
- {
- unsigned char i, j;
- i = 3;
- j = 82;
- do
- {
- while (--j);
- } while (--i);
- }
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標(biāo)志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x40 //180個(gè)時(shí)鐘
- unsigned char ch2 = 0X02; //通道選擇變量 0x02;選擇P1.2
- unsigned char ch3 = 0X03; //選擇P1.3
- unsigned char ch1 = 0X04; //選擇P1.4
- unsigned int fupingjishu = 0; //中斷計(jì)數(shù)的
- unsigned char count();
- //void INT0_TEST();
- void ADC_INIT ();
- void PCA_REG_PWM();
- void PCA_PIN_LV_ADJ(unsigned char );
- void Timer0Init(void);
- void Timer1Init(void);
- unsigned int ZHU_PIN_JIE_GUO_GetADCResult();
- unsigned char FU_PIN_JIE_GUO_GetADCResult();
- unsigned char ZHAN_KONG_BI_JIE_GUO_GetADCResult();
- void JI_SHUAN();
- //連接138譯碼器
- sbit LSA = P5^1;
- sbit LSB = P5^2;
- sbit LSC = P5^3;
- sbit LED1 = P0^3;
- //0-9 數(shù)碼段位顯示數(shù)字
- unsigned code sumaguan_duan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //位選信號(hào)
- unsigned char displaydata[7] ;
- void shu_ma_guan();
- void shumaguan_shuju_chuli(unsigned int zhupin,unsigned char fupin,unsigned char fupin_zhankongbi);
- main()
- {
- P5M0 = 0x00; //0000,0000 端口5模式寄存器0
- P5M1 = 0x00; //0000,0000 端口5模式寄存器1
- P4M0 = 0x00; //0000,0000 端口4模式寄存器0 數(shù)碼管用
- P4M1 = 0x00;
- P1M0 = 0x00; //
- P1M1 |= 0x1C; // 設(shè)置P1.2為高阻輸入模式
- P0M0 = 0x00; //0000,0000 端口4模式寄存器0 數(shù)碼管用
- P0M1 = 0x00;
- ADC_INIT ();
- PCA_REG_PWM();
- Timer0Init();
- // Timer1Init();
- while (1)
- {
-
- shu_ma_guan();
- shumaguan_shuju_chuli(ZHU_PIN_JIE_GUO_GetADCResult(),FU_PIN_JIE_GUO_GetADCResult(),ZHAN_KONG_BI_JIE_GUO_GetADCResult());
- PCA_PIN_LV_ADJ(FU_PIN_JIE_GUO_GetADCResult());
- CCAP0H = CCAP0L = ZHAN_KONG_BI_JIE_GUO_GetADCResult();
- // JI_SHUAN();
-
-
-
- }
- }
- // ADC初始化
- void ADC_INIT ()
-
- {
- P1ASF |= 0X1C; // 將P1.2 P1.3 P1.4 口作為ADC輸入信號(hào)
- ADC_RES=0; //清零轉(zhuǎn)換結(jié)果寄存器高8位
- ADC_RESL=0; //清零轉(zhuǎn)換結(jié)果寄存器低2位
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START ;
- }
- //高頻結(jié)果轉(zhuǎn)換 P1.2
- unsigned int ZHU_PIN_JIE_GUO_GetADCResult()
- {
- unsigned int zhupinjieguo;
- ADC_RES=0; //清零轉(zhuǎn)換結(jié)果寄存器高8位
- ADC_RESL=0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch1 | ADC_START; //打開電源 速度180個(gè)時(shí)鐘 選擇通道2 啟動(dòng)轉(zhuǎn)換
- _nop_(); //等待4個(gè)NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC轉(zhuǎn)換完成 全部為1 表示轉(zhuǎn)換完成
- ADC_CONTR &= ~0X80; //關(guān)閉ADC電源 節(jié)約功耗
- ADC_CONTR &= ~ADC_FLAG; //Close ADC 清楚標(biāo)識(shí)位
- zhupinjieguo =(ADC_RES<<2)+ADC_RESL; //將高2兩位 和低8位的結(jié)果相加得到10位的結(jié)果
- zhupinjieguo /= 4; //ad輸出的結(jié)果最大是1024按照,但是只要0-300
- //縮小倍率就是1023除以300就是3.41 故用1023除以3.41即可轉(zhuǎn)換為300
- return zhupinjieguo; //返回ADC結(jié)果
- }
- //PCA_PWM_頻率控制結(jié)果 P1.3
- unsigned char FU_PIN_JIE_GUO_GetADCResult()
- {
- unsigned int xdata fupingjieguo;
- ADC_RES=0; //清零轉(zhuǎn)換結(jié)果寄存器高8位
- ADC_RESL=0;
-
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch2 | ADC_START; //打開電源 速度180個(gè)時(shí)鐘 選擇通道2 啟動(dòng)轉(zhuǎn)換
- _nop_(); //等待4個(gè)NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC轉(zhuǎn)換完成 全部為1 表示轉(zhuǎn)換完成
- ADC_CONTR &= ~0X80; //關(guān)閉ADC電源 節(jié)約功耗
- ADC_CONTR &= ~ADC_FLAG; //Close ADC 清楚標(biāo)識(shí)位
- fupingjieguo = (ADC_RES<<2)+ADC_RESL; //將高2兩位 和低8位的結(jié)果相加得到10位的結(jié)果
- fupingjieguo /= 41; //ad輸出的結(jié)果最大是1024按照,但是只要0-25
- //縮小倍率就是1023除以25就是40.92 故用1023除以40.92即可轉(zhuǎn)換為25
- return fupingjieguo; //返回ADC結(jié)果
- }
- //PCA_PWM占空比結(jié)果 P1.4
- unsigned char ZHAN_KONG_BI_JIE_GUO_GetADCResult()
- {
- unsigned int zhankongbijieguo;
-
- ADC_RES=0; //清零轉(zhuǎn)換結(jié)果寄存器高8位
- ADC_RESL=0;
-
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch3 | ADC_START; //打開電源 速度180個(gè)時(shí)鐘 選擇通道2 啟動(dòng)轉(zhuǎn)換
- _nop_(); //等待4個(gè)NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC轉(zhuǎn)換完成 全部為1 表示轉(zhuǎn)換完成
- ADC_CONTR &= ~0X80; //關(guān)閉ADC電源 節(jié)約功耗
- ADC_CONTR &= ~ADC_FLAG; //Close ADC 清楚標(biāo)識(shí)位
- zhankongbijieguo =(ADC_RES<<2)+ADC_RESL; //將高2兩位 和低8位的結(jié)果相加得到10位的結(jié)果
- zhankongbijieguo /= 4; //ad輸出的結(jié)果最大是1024按照,但是占空比只要0-98可調(diào)
- //縮小倍率就是1023除以100就是10.43 故用1023除以10.43即可轉(zhuǎn)換為98
- return zhankongbijieguo; //返回ADC結(jié)果
- }
- //數(shù)碼管顯示屏函數(shù) 初始化函數(shù)
- void shu_ma_guan()
- {
- unsigned char xdata i ,count;
- count++;
- if(count == 10)
- count = 0;
- for(i=0;i<7;i++) //0 1 2 3 4 5 6
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- }
-
- P4=displaydata[i];
- Delay100us();
- P4 = 0X00; //消影信號(hào)
- }
- }
- //數(shù)碼管 數(shù)據(jù)接收與處理函數(shù)
- void shumaguan_shuju_chuli(unsigned int zhupin,unsigned char fupin,unsigned char fupin_zhankongbi)
- {
- // //低頻頻率
- displaydata[0] = sumaguan_duan[fupin/10%10];
- displaydata[1] = sumaguan_duan[fupin%10];
-
-
- // //低頻占空比
- displaydata[2] = sumaguan_duan[fupin_zhankongbi/10%10];
- displaydata[3] = sumaguan_duan[fupin_zhankongbi%10];
-
- //主頻頻率
- displaydata[4] = sumaguan_duan[zhupin/100%10];
- displaydata[5] = sumaguan_duan[zhupin/10%10];
- displaydata[6] = sumaguan_duan[zhupin%10];
-
- }
- //PCA_PWM寄存器配置
- void PCA_REG_PWM()
- {
-
- CMOD |=0X04; //1、CPS2、CPS1、CPS0系統(tǒng)時(shí)鐘,定時(shí)器0的溢出 脈沖
- //2、當(dāng)CIDL=0時(shí), 空閑模式下PCA計(jì)數(shù)器繼續(xù)工作;
- //允許ECF溢出中斷
-
- CCON &=0X00; //不需要中斷標(biāo)志位和中斷溢出所以并且初始化的時(shí)
- //候需要關(guān)閉PWM所以全部設(shè)置位0
-
- CCAPM0 |=0X42; //允許比較器功能控制位 允許脈寬調(diào)節(jié)模式 P1.1
- //ECOM0:允許比較器功能控制位。 允許比較器
- //CAPP0: 正捕獲控制位。 不允許
- //CAPN0:負(fù)捕獲控制位。 不允許
- //MAT0: 匹配 控制位 。 不允許
- //TOG0: 翻轉(zhuǎn)控制位。 不允許
- //PWM0: 脈寬調(diào)節(jié)模式 允許
- //ECCF0: 使能CCF0中斷 不允許
-
- // CCAPM1 |=0X42; //同上 P1.0
-
- CL = 0; //低位初值設(shè)置為0
- CH = 0; //高位初值設(shè)置為0
-
- CCAP0H = CCAP0L = 0x80; //PWM 設(shè)置占空比為50%
-
- // CCAP1L = 0x80; //PWM 設(shè)置占空比為50%
- // CCAP1H = 0x60; //PWM 設(shè)置占空比為50%
-
- PCA_PWM0 = 0X00; //PCA模塊0工作于8位PWM功能
- // PCA_PWM1 = 0X00; //PCA模塊1工作于8位PWM功能
- CR = 1 ;
- }
- ///*------------------------------------------
- //函數(shù)名: 定時(shí)器0
- //函數(shù)原型: void Timer0Init(void)
- //所在文件: TIMER_DOC.c
- //功能描述: timer0定時(shí)的時(shí)間主要是給內(nèi)部的
- // PCA_PWM提供時(shí)鐘頻率
- // 請(qǐng)?jiān)O(shè)置timer0為16位自動(dòng)動(dòng)重裝
- // 這樣出來的頻率精度高
- //輸入?yún)?shù): 無
- //返回: 無
- //作者: Alan
- //時(shí)間: 2021年8月30日22:05:59
- //-------------------------------------------*/
- //定時(shí)器0溢出 設(shè)置PCA時(shí)鐘用于調(diào)節(jié)頻率
- void Timer0Init(void)
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0xA0; //設(shè)置定時(shí)初值
- TH0 = 0xF6; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- }
- //頻率可調(diào)更新函數(shù)
- void PCA_PIN_LV_ADJ(unsigned char fuping)
- {
- unsigned long temp;
- //重新初始化定時(shí)初值
- temp = 0x10000-24000000/(fuping*256);
- TH0 = temp>>8; //設(shè)置定時(shí)初值
- TL0 = temp; //設(shè)置定時(shí)初值
- }
- //void Timer1Init() //1毫秒@24MHz
- //{
- // AUXR |= 0x40; //定時(shí)器時(shí)鐘1T模式
- // TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- // TL1 = 0x40; //設(shè)置定時(shí)初值
- // TH1 = 0xA2; //設(shè)置定時(shí)初值
- // TF1 = 0; //清除TF1標(biāo)志
- // TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
- // ET1 = 1;
- // EA = 1;
- //}
- //void tm1_isr() interrupt 3
- //{
- // fupingjishu++;
- //}
- //void JI_SHUAN()
- //{
- //
- // unsigned char temp;
- //
- // temp = 1000UL/ZHU_PIN_JIE_GUO_GetADCResult()/2;
- //
- // if(fupingjishu >= temp )
- // {
- // fupingjishu = 0;
- // LED1 = ~LED1; //將測試口取反
- // }
- //}
- 其實(shí)沒有什么好深?yuàn)W的地方 核心地方就是這里
- //頻率可調(diào)更新函數(shù)
- void PCA_PIN_LV_ADJ(unsigned char fuping)
- {
- unsigned long temp;
- //重新初始化定時(shí)初值
- temp = 0x10000-24000000/(fuping*256);
- TH0 = temp>>8; //設(shè)置定時(shí)初值
- TL0 = temp; //設(shè)置定時(shí)初值
- }
復(fù)制代碼
24000000是晶振的頻率 后面的fuping是你要多少HZ就填多少即可 最大值是有限制的 和你的晶振 還是定時(shí)器溢出的PCA時(shí)鐘頻率有關(guān)系 這個(gè)可以自己去調(diào)節(jié) 設(shè)置即可 |
評(píng)分
-
查看全部評(píng)分
|