CCD driver implemented on ZYNQ7000

Finally put the TCD1304 linear CCD driver onto my XC7Z020 board. The IP core provides an AXI-Lite interface for register access to adjust the CCD driving parameters in realtime. It also offers a high-speed AXI-Stream port for CCD reading output. Connecting the AXI-Stream port to an AXI-Data FIFO IP followed by a Xilinx VDMA IP, we can automatically save frames into a pre-allocated memory pool which act as a frame buffer. Thanks to the VDMA IP core, I can quickly get informed from the linux side when buffer is ready and get synced with the CCD driver.

Myir XC7Z020 board, connected to my home network through 1000Mbps ethernet.

TCD1304 linear CCD and a temporary LTC1865A 250ksps 16bit ADC with serial interface, I will replace it with AD7960 in future design.

Oscilloscope result: Red is ICG trigger, yellow is CCD buffered output.


Write a python application monitoring lasers!

Life is short, use python!

There are bunches of frameworks to support a graphical user interface (GUI) on your python application. I choose to use wxPython because I was familiar with that. I embed the graph generated by matplotlib into the GUI to give realtime updating of the data.

This application uses a HighFinesse wavelength meter monitoring a Rubidium locked laser and a commercial He-Ne laser. It can automatically record data into a file and calculate the deviation. A round-robin buffer is used to show short-term and long-term data.





TCD1304 Verilog Driver for Spectrometer Project

Spend several hours to finish some verilog HDL code driving a TCD1304DG linear CCD from Toshiba. This work is intended for the CCD spectrometer project in the future.

The project will utilize a high precision 18bit SAR ADC (AD7960) to sample the CCD output at a very fast speed up to 5MSa/s. The code is written versatilely that many timing constraints can be directly reprogrammed through registers. When I finish the connection between this IP and the Zynq 7000 PS, it would be convenient to control the CCD sampling parameters from linux side.

The simulation result is shown below.

The 8th row: SH signal

The 9th row: ICG signal

The 10th row: MCLK signal for CCD


Digital Temperature Control

Temperature control again 🙂

We have been customed to fully analog controlled temperature controllers like those made by Toptica in the past. The parameters(proportion, integral time, etc) of those controllers should be adjusted with the assist of an oscilloscope. You cannot use those experience formula because you cannot set a multi-turn potentiometer to 1/2.2 value. And if you don’t have an expensive monitor module, you don’t even know the temperature set point! How can these modules be used in an experiment?

In order to address this problem, I decide to make this digital version temperature controller.

Here is the photo of my final controller.


This temperature controller is designed to be compatible with three kinds of common temperature sensors – NTC sensor, PT100 RTD sensor, Thermocouple. With this powerful design, the controller can manage temperature from as low  as several kelvin to a thousand degree celsius.

Three analog frond ends provide adequate working condition for the sensors as well as amplify the signal and scale them to fit into ADC’s input range.

The ADC in this project is AD7793, a low cost two channels (if you use external reference as I did) 24bit delta-sigma ADC, connected to the main processor through high speed SPI protocol. The ADC is running on a 64kHz clock generated by main processor’s timer. The main processor’s PID calculation and output refresh is synchronized by the ADC’s ready signal.

Digital PID for temperature is never a tricky problem for those high speed micro controllers. I even use double precision float type for all variables and the controller still works great. 72MHz/90DMIPS is a monster for the tiny task!

The DAC is AD5689, a two channels 16bit DAC, is definitely sufficient to drive any TEC or heater. A instrumental amplifier shift the middle level to zero voltage and drive a push-pull output stage with feedback to provide a maximum of 25W power.

The output is monitored all the time, you can check the output voltage, output current, output power as needed. Warning functions such as sensor fault, output short circuit, output over current, output open circuit, can be easily implemented in this hardware design.

Based on my OLED driver and graphic library written years ago, I can quickly developed the firmware for this controller with gorgeous OLED display and fancy user interface.


The interaction can be done through a couple of buttons and a rotatory encoder, which definitely provide a smooth user experience.

I have tested this controller under many circumstance, vacuum chamber, ECDL housing for example. With proper heat insulation  design and careful PID adjustment, <1mK temperature stability can be easily achieved with NTC sensor near room temperature.

This controller has been successfully deployed into my ECDL project, and helped a great deal pushing a 690nm laser diode for a 698nm output, which will be used in Sr experiment in the future.

Got a new SBM-20M Geiger-Muller tube

Here it is.


According to seller’s introduction, this is a Geiger-Muller tube from Ukraine. The parameters of this tiny tube are listed below.


Radiation determine: beta soft/hard gamma soft/hard
Voltage of start of counter: 260-320V
Operating voltage: 350-475V
Length of flat part of counting curve (plateau): 100V
Slope of the counting data: <0.15%/V
Own background: <1 imps/s
Working life: 50*10^10 counts
Weight: 2.5g
Dimensions: counter length 48mm, diameter 10mm

I should start preparing for a small high voltage supply for this tiny stuff 🙂